[{"data":1,"prerenderedAt":64},["ShallowReactive",2],{"integration-node-red-contrib-opentelemetry\u002F":3},{"_id":4,"categories":5,"author":8,"description":12,"npmOwners":13,"npmScope":14,"name":4,"ffCertified":15,"downloads":16,"version":18,"updatedAt":19,"maintainers":20,"homepage":22,"bugs":23,"repository":25,"time":28,"lastUpdated":19,"created":29,"license":49,"githubOwner":9,"githubRepo":4,"examples":50,"readme":63},"node-red-contrib-opentelemetry",[6,7],"catalogue_utility","catalogue",{"name":9,"email":10,"url":11},"nioc","dev@nioc.eu","https:\u002F\u002Fgithub.com\u002Fnioc\u002F","Distributed tracing with OpenTelemetry SDK and Prometheus metrics exporter for Node-RED",[9],null,false,{"week":17},2493,"2.2.0","2026-08-30T03:15:28.472Z",[21],{"name":9,"email":10},"https:\u002F\u002Fgithub.com\u002Fnioc\u002Fnode-red-contrib-opentelemetry",{"url":24},"https:\u002F\u002Fgithub.com\u002Fnioc\u002Fnode-red-contrib-opentelemetry\u002Fissues",{"type":26,"url":27},"git","git+https:\u002F\u002Fgithub.com\u002Fnioc\u002Fnode-red-contrib-opentelemetry.git",{"created":29,"modified":19,"1.0.0":30,"1.0.1":31,"1.0.2":32,"1.1.0":33,"1.2.0":34,"1.3.0":35,"1.3.1":36,"1.4.0":37,"1.5.0":38,"1.5.1":39,"1.6.0":40,"1.6.1":41,"1.6.2":42,"1.6.3":43,"1.6.4":44,"2.0.0":45,"2.0.1":46,"2.1.0":47,"2.2.0":48},"2023-03-11T02:33:55.908Z","2023-03-09T15:29:53.139Z","2023-03-11T02:33:56.052Z","2023-03-12T22:11:12.874Z","2023-11-29T23:34:48.681Z","2024-05-15T22:39:10.811Z","2024-09-11T21:15:00.754Z","2024-12-30T22:32:04.587Z","2024-12-31T03:09:30.629Z","2025-01-11T18:31:23.221Z","2025-01-12T00:01:55.121Z","2025-01-18T19:17:03.728Z","2025-01-19T20:43:27.568Z","2025-01-22T23:32:09.640Z","2025-02-05T23:03:55.250Z","2026-03-31T23:53:22.005Z","2026-08-08T00:53:49.046Z","2026-08-08T09:18:33.732Z","2026-08-09T15:59:11.654Z","2026-08-30T03:15:28.354Z","LGPL-3.0-or-later",[51,57],{"name":52,"path":53,"url":54,"downloadUrl":55,"flow":56},"OpenTelemetry","examples\u002FOpenTelemetry.json","https:\u002F\u002Fgithub.com\u002Fnioc\u002Fnode-red-contrib-opentelemetry\u002Fblob\u002Fmaster\u002Fexamples\u002FOpenTelemetry.json","https:\u002F\u002Fraw.githubusercontent.com\u002Fnioc\u002Fnode-red-contrib-opentelemetry\u002Fmaster\u002Fexamples\u002FOpenTelemetry.json","[{\"id\":\"1dc4c3fe2e38934c\",\"type\":\"tab\",\"label\":\"OpenTelemetry\",\"disabled\":false,\"info\":\"This is an example of a flow for the OpenTelemetry node.\",\"env\":[]},{\"id\":\"ac125c4c6d10643e\",\"type\":\"OpenTelemetry\",\"z\":\"1dc4c3fe2e38934c\",\"name\":\"\",\"url\":\"http:\u002F\u002Flocalhost:4318\u002Fv1\u002Ftraces\",\"serviceName\":\"Node-RED\",\"rootPrefix\":\"Message\",\"timeout\":\"10\",\"ignoredTypes\":\"debug,catch\",\"propagateHeadersTypes\":\"\",\"isLogging\":false,\"x\":760,\"y\":160,\"wires\":[]}]",{"name":58,"path":59,"url":60,"downloadUrl":61,"flow":62},"Prometheus","examples\u002FPrometheus.json","https:\u002F\u002Fgithub.com\u002Fnioc\u002Fnode-red-contrib-opentelemetry\u002Fblob\u002Fmaster\u002Fexamples\u002FPrometheus.json","https:\u002F\u002Fraw.githubusercontent.com\u002Fnioc\u002Fnode-red-contrib-opentelemetry\u002Fmaster\u002Fexamples\u002FPrometheus.json","[{\"id\":\"1dc4c3fe2e38934c\",\"type\":\"tab\",\"label\":\"Prometheus exporter\",\"disabled\":false,\"info\":\"This is an example of a flow for the Prometheus node.\",\"env\":[]},{\"id\":\"9a4cbf20508e704a\",\"type\":\"Prometheus Exporter\",\"z\":\"1dc4c3fe2e38934c\",\"name\":\"Prometheus\",\"endpoint\":\"\u002Fmetrics\",\"port\":1881,\"serviceName\":\"Node-RED\",\"instrumentName\":\"http_request_duration\",\"x\":330,\"y\":140,\"wires\":[]}]","\u003Ch1 id=\"node-red-opentelemetry\">\u003Ca class=\"header-anchor\" href=\"#node-red-opentelemetry\">Node-RED OpenTelemetry\u003C\u002Fa>\u003C\u002Fh1>\n\u003Cp>\u003Ca href=\"https:\u002F\u002Fwww.gnu.org\u002Flicenses\u002Flgpl-3.0\">\u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Flicense-LGPL--3.0--or--later-blue.svg\" alt=\"license: LGPLv3\" \u002F>\u003C\u002Fa>\n\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fnioc\u002Fnode-red-contrib-opentelemetry\u002Freleases\u002Flatest\">\u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Frelease\u002Fnioc\u002Fnode-red-contrib-opentelemetry.svg\" alt=\"GitHub release\" \u002F>\u003C\u002Fa>\n\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fnioc\u002Fnode-red-contrib-opentelemetry\u002Factions\u002Fworkflows\u002Fcommit.yml\">\u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Factions\u002Fworkflow\u002Fstatus\u002Fnioc\u002Fnode-red-contrib-opentelemetry\u002Fcommit.yml?label=check\" alt=\"GitHub Check Workflow Status\" \u002F>\u003C\u002Fa>\n\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fnioc\u002Fnode-red-contrib-opentelemetry\u002Factions\u002Fworkflows\u002Fpublish.yml\">\u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Factions\u002Fworkflow\u002Fstatus\u002Fnioc\u002Fnode-red-contrib-opentelemetry\u002Fpublish.yml?label=publish\" alt=\"GitHub Publish Workflow Status\" \u002F>\u003C\u002Fa>\n\u003Ca href=\"https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002Fnode-red-contrib-opentelemetry\">\u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fnpm\u002Fdt\u002Fnode-red-contrib-opentelemetry\" alt=\"npm\" \u002F>\u003C\u002Fa>\u003C\u002Fp>\n\u003Cp>Distributed tracing with OpenTelemetry SDK and Prometheus metrics exporter for Node-RED\u003C\u002Fp>\n\u003Ch2 id=\"key-features\">\u003Ca class=\"header-anchor\" href=\"#key-features\">Key features\u003C\u002Fa>\u003C\u002Fh2>\n\u003Ch3 id=\"traces\">\u003Ca class=\"header-anchor\" href=\"#traces\">Traces\u003C\u002Fa>\u003C\u002Fh3>\n\u003Cul>\n\u003Cli>based on \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fopen-telemetry\u002Fopentelemetry-js\">OpenTelemetry JavaScript framework\u003C\u002Fa> and \u003Ca href=\"https:\u002F\u002Fnodered.org\u002Fdocs\u002Fapi\u002Fhooks\u002Fmessaging\">Node-RED messaging hooks\u003C\u002Fa>:\n\u003Cul>\n\u003Cli>create spans on \u003Ccode>onSend(source)\u003C\u002Fcode> and \u003Ccode>postDeliver(destination)\u003C\u002Fcode> events,\u003C\u002Fli>\n\u003Cli>end spans on \u003Ccode>onComplete\u003C\u002Fcode> and \u003Ccode>postDeliver(source)\u003C\u002Fcode> events.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003C\u002Fli>\n\u003Cli>one trace per flow execution: every node reached by a message is a child span of a trace, regardless of any changes made to the message's identifier (see \u003Ca href=\"#what-is-a-local-root-span\">What is a \u003Cem>local root span\u003C\u002Fem>?\u003C\u002Fa>),\u003C\u002Fli>\n\u003Cli>completes the caller trace when the entry node receives a \u003Ca href=\"https:\u002F\u002Fwww.w3.org\u002FTR\u002Ftrace-context\u002F#design-overview\">W3C trace context\u003C\u002Fa> (\u003Ccode>http in\u003C\u002Fcode> headers, \u003Ccode>mqtt in\u003C\u002Fcode> v5 user properties, \u003Ccode>amqp-in\u003C\u002Fcode> headers),\u003C\u002Fli>\n\u003Cli>trace includes:\n\u003Cul>\n\u003Cli>run id (internal identifier, based on msg._id and an incremental sequence),\u003C\u002Fli>\n\u003Cli>type of the node that triggered the message (\u003Ccode>node_red.trigger.type\u003C\u002Fcode>, on the local root span),\u003C\u002Fli>\n\u003Cli>message id,\u003C\u002Fli>\n\u003Cli>flow id,\u003C\u002Fli>\n\u003Cli>node id,\u003C\u002Fli>\n\u003Cli>node type,\u003C\u002Fli>\n\u003Cli>node name (if filled),\u003C\u002Fli>\n\u003Cli>hostname,\u003C\u002Fli>\n\u003Cli>optional \u003Ccode>http status code\u003C\u002Fcode> (for request node type),\u003C\u002Fli>\n\u003Cli>optional \u003Ccode>exception\u003C\u002Fcode>,\u003C\u002Fli>\n\u003Cli>optional custom attributes based on message data.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cimg src=\"https:\u002F\u002Fraw.githubusercontent.com\u002Fnioc\u002Fnode-red-contrib-opentelemetry\u002Fmaster\u002Fdocs\u002FScreenshot_01.png\" alt=\"Example spans in JaegerUI\" title=\"Example spans\" \u002F>\u003C\u002Fp>\n\u003Cp>\u003Cimg src=\"https:\u002F\u002Fraw.githubusercontent.com\u002Fnioc\u002Fnode-red-contrib-opentelemetry\u002Fmaster\u002Fdocs\u002FScreenshot_02.png\" alt=\"Example spans to metrics in Grafana\" title=\"Example spans to metrics\" \u002F>\u003C\u002Fp>\n\u003Ch4 id=\"what-is-a-local-root-span\">\u003Ca class=\"header-anchor\" href=\"#what-is-a-local-root-span\">What is a \u003Cem>local root span\u003C\u002Fem>?\u003C\u002Fa>\u003C\u002Fh4>\n\u003Cp>A trace corresponds to an execution of your flow. The first node to emit a message opens a \u003Cstrong>local root span\u003C\u002Fstrong>, each node reached by the message becomes a child span, and the local root span ends when the last of those node spans ends. The local root span carries \u003Ccode>node_red.trigger.type\u003C\u002Fcode>, which is the type of the node that triggered the execution. This allows a collector to route or filter it without having to read the spans of the individual nodes.\u003C\u002Fp>\n\u003Cp>The \u003Cstrong>local\u003C\u002Fstrong> root span corresponds to the root of the trace, unless a trace context has been passed with the message, in which case it is a child span of the caller's span.\u003C\u002Fp>\n\u003Cp>By default, every node span is a child of it, resulting in a flat timeline that is easy to read and allows you to see at a glance where time has elapsed. Check the \u003Ccode>Nest spans\u003C\u002Fcode> box in the OTEL node configuration so that a node span becomes a child of the span of the node that sent it the message. This allows you to trace the path taken by a message or build a dependency graph, at the cost of a deeper waterfall. A chain with more than 50 levels restarts from the local root span.\u003C\u002Fp>\n\u003Cp>Node-RED assigns a fresh \u003Ccode>_msgid\u003C\u002Fcode> to each message object emitted by a node. To keep those in the same trace, the run identifier is carried in the message's new \u003Ccode>otelRootMsgId\u003C\u002Fcode> property (known internally as \u003Ccode>runId\u003C\u002Fcode>).\u003C\u002Fp>\n\u003Cp>Two situations deliberately produce more than one trace, following the \u003Ca href=\"https:\u002F\u002Fopentelemetry.io\u002Fdocs\u002Fspecs\u002Fsemconv\u002Fmessaging\u002Fmessaging-spans\u002F\">messaging semantic conventions\u003C\u002Fa>:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>a \u003Cstrong>node that acknowledges receipt of a message and emits later\u003C\u002Fstrong> (\u003Ccode>delay\u003C\u002Fcode>, \u003Ccode>trigger\u003C\u002Fcode>, rate limiter) creates a new trace, connected to the one from which it originated by a span link (\u003Ccode>node_red.link.type: continuation\u003C\u002Fcode>),\u003C\u002Fli>\n\u003Cli>a \u003Cstrong>message published to a broker and consumed by another flow\u003C\u002Fstrong> creates a new trace, correlated through the propagated trace context.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>Nodes that never report completion (\u003Ccode>tcp in\u003C\u002Fcode>, \u003Ccode>server-events\u003C\u002Fcode>, ...) have their spans closed as soon as the message they created has been dispatched. A trace that remains incomplete beyond the configured \u003Ccode>timeout\u003C\u002Fcode> is closed by a cleanup, and the spans of nodes that are still open are ended and flagged with \u003Ccode>node_red.span.incomplete\u003C\u002Fcode> instead of being dropped.\u003C\u002Fp>\n\u003Ch3 id=\"metrics\">\u003Ca class=\"header-anchor\" href=\"#metrics\">Metrics\u003C\u002Fa>\u003C\u002Fh3>\n\u003Cul>\n\u003Cli>export of request metrics from \u003Ccode>http in\u003C\u002Fcode> nodes (for Prometheus scraping):\n\u003Cul>\n\u003Cli>method,\u003C\u002Fli>\n\u003Cli>route,\u003C\u002Fli>\n\u003Cli>status,\u003C\u002Fli>\n\u003Cli>ip\u003C\u002Fli>\n\u003Cli>duration.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cpre>\u003Ccode class=\"language-bash\">curl http:\u002F\u002Flocalhost:1881\u002Fmetrics\n# HELP target_info Target metadata\n# TYPE target_info gauge\ntarget_info{service_name=\"Node-RED\",telemetry_sdk_language=\"nodejs\",telemetry_sdk_name=\"opentelemetry\",telemetry_sdk_version=\"1.30.0\"} 1\n# HELP http_request_duration Response time for incoming http requests in milliseconds\n# UNIT http_request_duration ms\n# TYPE http_request_duration histogram\nhttp_request_duration_count{method=\"POST\",route=\"\u002Fapi\u002Ftest\",status=\"201\",ip=\"127.0.0.1\"} 5\nhttp_request_duration_sum{method=\"POST\",route=\"\u002Fapi\u002Ftest\",status=\"201\",ip=\"127.0.0.1\"} 620\nhttp_request_duration_bucket{method=\"POST\",route=\"\u002Fapi\u002Ftest\",status=\"201\",ip=\"127.0.0.1\",le=\"0\"} 0\nhttp_request_duration_bucket{method=\"POST\",route=\"\u002Fapi\u002Ftest\",status=\"201\",ip=\"127.0.0.1\",le=\"25\"} 0\nhttp_request_duration_bucket{method=\"POST\",route=\"\u002Fapi\u002Ftest\",status=\"201\",ip=\"127.0.0.1\",le=\"50\"} 4\nhttp_request_duration_bucket{method=\"POST\",route=\"\u002Fapi\u002Ftest\",status=\"201\",ip=\"127.0.0.1\",le=\"75\"} 4\nhttp_request_duration_bucket{method=\"POST\",route=\"\u002Fapi\u002Ftest\",status=\"201\",ip=\"127.0.0.1\",le=\"100\"} 4\nhttp_request_duration_bucket{method=\"POST\",route=\"\u002Fapi\u002Ftest\",status=\"201\",ip=\"127.0.0.1\",le=\"250\"} 4\nhttp_request_duration_bucket{method=\"POST\",route=\"\u002Fapi\u002Ftest\",status=\"201\",ip=\"127.0.0.1\",le=\"500\"} 4\nhttp_request_duration_bucket{method=\"POST\",route=\"\u002Fapi\u002Ftest\",status=\"201\",ip=\"127.0.0.1\",le=\"1000\"} 5\nhttp_request_duration_bucket{method=\"POST\",route=\"\u002Fapi\u002Ftest\",status=\"201\",ip=\"127.0.0.1\",le=\"2000\"} 5\nhttp_request_duration_bucket{method=\"POST\",route=\"\u002Fapi\u002Ftest\",status=\"201\",ip=\"127.0.0.1\",le=\"+Inf\"} 5\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"installation\">\u003Ca class=\"header-anchor\" href=\"#installation\">Installation\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cp>Search \u003Ccode>node-red-contrib-opentelemetry\u003C\u002Fcode> within the palette manager or install with npm from the command-line (within your user data directory):\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-bash\">npm install node-red-contrib-opentelemetry\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>As with every \u003Ca href=\"https:\u002F\u002Fnodered.org\u002Fdocs\u002Fuser-guide\u002Fruntime\u002Fadding-nodes\">node installation\u003C\u002Fa>, you will need to restart Node-RED for it to pick-up the new nodes.\u003C\u002Fp>\n\u003Ch2 id=\"usage\">\u003Ca class=\"header-anchor\" href=\"#usage\">Usage\u003C\u002Fa>\u003C\u002Fh2>\n\u003Ch3 id=\"traces-1\">\u003Ca class=\"header-anchor\" href=\"#traces-1\">Traces\u003C\u002Fa>\u003C\u002Fh3>\n\u003Cul>\n\u003Cli>Add OTEL node \u003Cstrong>once\u003C\u002Fstrong> (to any flow),\u003C\u002Fli>\n\u003Cli>Setup the node:\n\u003Cul>\n\u003Cli>set OTEL \u003Ca href=\"https:\u002F\u002Fopentelemetry.io\u002Fdocs\u002Finstrumentation\u002Fjs\u002Fexporters\u002F\">exporter\u003C\u002Fa> url (example for Jaeger: \u003Ccode>http:\u002F\u002Flocalhost:4318\u002Fv1\u002Ftraces\u003C\u002Fcode>),\u003C\u002Fli>\n\u003Cli>choose an OTLP transport protocol (\u003Ccode>http\u002Fjson\u003C\u002Fcode> or \u003Ccode>http\u002Fprotobuf\u003C\u002Fcode>),\u003C\u002Fli>\n\u003Cli>set the \u003Ccode>auth\u003C\u002Fcode> scheme your collector requires (see \u003Ca href=\"#exporter-authentication\">Exporter authentication\u003C\u002Fa>),\u003C\u002Fli>\n\u003Cli>define a service name (will be displayed as span service),\u003C\u002Fli>\n\u003Cli>define naming convention for the local root spans:\n\u003Cul>\n\u003Cli>optional root span prefix (will be added in Node-RED root span name),\u003C\u002Fli>\n\u003Cli>whether or not to include the flow name,\u003C\u002Fli>\n\u003C\u002Ful>\n\u003C\u002Fli>\n\u003Cli>define nodes that should not send traces (using comma-separated list like \u003Ccode>debug,catch\u003C\u002Fcode>),\u003C\u002Fli>\n\u003Cli>define nodes that should propagate \u003Ca href=\"https:\u002F\u002Fwww.w3.org\u002FTR\u002Ftrace-context\u002F#design-overview\">W3C trace context\u003C\u002Fa> (in http request headers, using a comma-separated list; for example: \u003Ccode>http request,my-custom-node\u003C\u002Fcode>),\u003C\u002Fli>\n\u003Cli>define time in seconds after which an inactive local root span is considered abandoned and closed,\u003C\u002Fli>\n\u003Cli>define custom span attributes you want to send (optionally).\u003C\u002Fli>\n\u003C\u002Ful>\n\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch4 id=\"exporter-authentication\">\u003Ca class=\"header-anchor\" href=\"#exporter-authentication\">Exporter authentication\u003C\u002Fa>\u003C\u002Fh4>\n\u003Cp>If your collector requires authentication, select an authentication scheme in the OTEL configuration node:\u003C\u002Fp>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Scheme\u003C\u002Fth>\n\u003Cth>Header sent\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>None\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>none\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>Bearer token\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>Authorization: Bearer &lt;token&gt;\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>Basic\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>Authorization: Basic &lt;base64 of user:password&gt;\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>Custom header\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>&lt;header name&gt;: &lt;value&gt;\u003C\u002Fcode>, for example \u003Ccode>x-api-key: ...\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>The secret is kept in the \u003Ca href=\"https:\u002F\u002Fnodered.org\u002Fdocs\u002Fcreating-nodes\u002Fcredentials\">node credentials\u003C\u002Fa>, so it is stored apart from the flow: it does not end up in \u003Ccode>flows.json\u003C\u002Fcode>, nor in a flow you export or commit.\u003C\u002Fp>\n\u003Cp>It is also possible to send non-confidential headers (such as the name of a dataset, an organization, or a feed) via the \u003Ccode>additional exporter headers\u003C\u002Fcode>.\u003C\u002Fp>\n\u003Cp>Headers set in the \u003Ccode>OTEL_EXPORTER_OTLP_HEADERS\u003C\u002Fcode> environment variable are still sent, which is convenient for container deployments:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-bash\">OTEL_EXPORTER_OTLP_HEADERS=\"authorization=Basic cm9vdDpwYXNz,x-tenant=acme\"\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>A header configured on the node takes precedence over the environment for the same name.\u003C\u002Fp>\n\u003Ch3 id=\"metrics-1\">\u003Ca class=\"header-anchor\" href=\"#metrics-1\">Metrics\u003C\u002Fa>\u003C\u002Fh3>\n\u003Cul>\n\u003Cli>Add Prometheus node \u003Cstrong>once\u003C\u002Fstrong> (to any flow),\u003C\u002Fli>\n\u003Cli>Setup the node:\n\u003Cul>\n\u003Cli>set Prometheus export port and endpoint (example: \u003Ccode>1881\u003C\u002Fcode> and \u003Ccode>\u002Fmetrics\u003C\u002Fcode>),\u003C\u002Fli>\n\u003Cli>define a service name (will be displayed in export),\u003C\u002Fli>\n\u003Cli>define a instrument name (will be displayed in export),\u003C\u002Fli>\n\u003C\u002Ful>\n\u003C\u002Fli>\n\u003Cli>Add middleware to your \u003Ccode>settings.js\u003C\u002Fcode> file:\u003Cpre>\u003Ccode class=\"language-js\">  \u002F\u002F import the prometheus middleware\n  const { prometheusMiddleware } = require('node-red-contrib-opentelemetry\u002Flib\u002Fprometheus-exporter.js')\n  \u002F\u002F ...\n  \u002F\u002F then add it to the existing httpNodeMiddleware attribute\n  httpNodeMiddleware: prometheusMiddleware,\n  \u002F\u002F ...\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2 id=\"versioning\">\u003Ca class=\"header-anchor\" href=\"#versioning\">Versioning\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cp>\u003Ccode>node-red-contrib-opentelemetry\u003C\u002Fcode> is maintained under the \u003Ca href=\"https:\u002F\u002Fsemver.org\u002F\">semantic versioning\u003C\u002Fa> guidelines.\u003C\u002Fp>\n\u003Cp>See the \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fnioc\u002Fnode-red-contrib-opentelemetry\u002Freleases\">releases\u003C\u002Fa> on this repository for changelog.\u003C\u002Fp>\n\u003Ch2 id=\"contributors\">\u003Ca class=\"header-anchor\" href=\"#contributors\">Contributors\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cul>\n\u003Cli>\u003Cstrong>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fnioc\u002F\">Nioc\u003C\u002Fa>\u003C\u002Fstrong> - \u003Cem>Initial work\u003C\u002Fem>\u003C\u002Fli>\n\u003Cli>\u003Cstrong>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fwodka\u002F\">Wodka\u003C\u002Fa>\u003C\u002Fstrong> - \u003Cem>AMQP headers and \u003Ccode>CompositePropagator\u003C\u002Fcode> (Jaeger, W3C, B3)\u003C\u002Fem>\u003C\u002Fli>\n\u003Cli>\u003Cstrong>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fakrpic77\u002F\">Akrpic77\u003C\u002Fa>\u003C\u002Fstrong> - \u003Cem>MQTT v5 context fields\u003C\u002Fem>\u003C\u002Fli>\n\u003Cli>\u003Cstrong>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fjoshendriks\u002F\">Joshendriks\u003C\u002Fa>\u003C\u002Fstrong> - \u003Cem>Protobuf trace-exporter support\u003C\u002Fem>\u003C\u002Fli>\n\u003Cli>\u003Cstrong>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fczepiec\u002F\">Czepiec\u003C\u002Fa>\u003C\u002Fstrong> - \u003Cem>\u003Ccode>node_red.flow.name\u003C\u002Fcode> span attribute\u003C\u002Fem>\u003C\u002Fli>\n\u003Cli>\u003Cstrong>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fsyron\u002F\">Syron\u003C\u002Fa>\u003C\u002Fstrong> - \u003Cem>Improve flow tracing (per run), exporter authentication, nested spans and tests\u003C\u002Fem>\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>See also the full list of \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fnioc\u002Fnode-red-contrib-opentelemetry\u002Fgraphs\u002Fcontributors\">contributors\u003C\u002Fa> to this project.\u003C\u002Fp>\n\u003Ch2 id=\"direct-dependencies\">\u003Ca class=\"header-anchor\" href=\"#direct-dependencies\">Direct dependencies\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cul>\n\u003Cli>\u003Cstrong>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fopen-telemetry\u002Fopentelemetry-js\">@opentelemetry\u003C\u002Fa>\u003C\u002Fstrong> (Apache-2.0)\u003C\u002Fli>\n\u003Cli>\u003Cstrong>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fjmespath\u002Fjmespath.js\">jmespath\u003C\u002Fa>\u003C\u002Fstrong> (Apache-2.0)\u003C\u002Fli>\n\u003Cli>\u003Cstrong>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fjshttp\u002Fon-finished\">on-finished\u003C\u002Fa>\u003C\u002Fstrong> (MIT)\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2 id=\"license\">\u003Ca class=\"header-anchor\" href=\"#license\">License\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cp>This project is licensed under the GNU Lesser General Public License v3.0 - see the \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fnioc\u002Fnode-red-contrib-opentelemetry\u002Fblob\u002Fmaster\u002FLICENSE.md\">LICENSE\u003C\u002Fa> file for details\u003C\u002Fp>\n",1788169464977]