Bumps [go.opentelemetry.io/contrib/instrumentation/runtime](https://github.com/open-telemetry/opentelemetry-go-contrib) from 0.64.0 to 0.65.0. <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/open-telemetry/opentelemetry-go-contrib/releases">go.opentelemetry.io/contrib/instrumentation/runtime's releases</a>.</em></p> <blockquote> <h2>Release v1.40.0/v2.2.0/v0.65.0/v0.34.0/v0.20.0/v0.15.0/v0.13.0/v0.12.0</h2> <h2>Overview</h2> <h3>Added</h3> <ul> <li><code>WithMetricAttributesFn</code> option in <code>go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc</code> to define dynamic attributes on auto-instrumented metrics. (<a href="https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8191">#8191</a>)</li> <li>Add support for configuring propagators in <code>go.opentelemetry.io/contrib/otelconf</code>. (<a href="https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8281">#8281</a>)</li> <li>Add <code>const Version</code> in <code>go.opentelemetry.io/contrib/bridges/prometheus</code>. (<a href="https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8401">#8401</a>)</li> <li>Add <code>const Version</code> in <code>go.opentelemetry.io/contrib/otelconf</code>. (<a href="https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8461">#8461</a>)</li> <li>Add <code>const Version</code> in <code>go.opentelemetry.io/contrib/bridges/otellogr</code>. (<a href="https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8477">#8477</a>)</li> <li>Add <code>const Version</code> in <code>go.opentelemetry.io/contrib/bridges/otellogrus</code>. (<a href="https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8485">#8485</a>)</li> <li>Add <code>const Version</code> in <code>go.opentelemetry.io/contrib/bridges/otelslog</code>. (<a href="https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8480">#8480</a>)</li> </ul> <h3>Fixed</h3> <ul> <li>Fix panic when passing nil <code>TracerProvider</code> or <code>MeterProvider</code> to <code>WithTracerProvider</code> or <code>WithMeterProvider</code> in <code>go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc</code>. (<a href="https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8323">#8323</a>)</li> <li><code>Transport</code> in <code>go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp</code> now supports reading request body multiple times for subsequent requests that reuse <code>http.Request</code>. (<a href="https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8352">#8352</a>)</li> </ul> <h3>Changed</h3> <ul> <li>The <code>Version()</code> function in <code>go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp</code> has been replaced by <code>const Version</code>. (<a href="https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8142">#8142</a>)</li> <li>The <code>Version()</code> function in <code>go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace</code> has been replaced by <code>const Version</code>. (<a href="https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8302">#8302</a>)</li> <li>The <code>Version()</code> function in <code>go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc</code> has been replaced by <code>const Version</code>. (<a href="https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8317">#8317</a>)</li> <li>The <code>Version()</code> function in <code>go.opentelemetry.io/contrib/zpages</code> has been replaced by <code>const Version</code>. (<a href="https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8325">#8325</a>)</li> <li>The <code>Version()</code> function in <code>go.opentelemetry.io/contrib/instrumentation/go.mongodb.org/mongo-driver/mongo/otelmongo</code> has been replaced by <code>const Version</code>. (<a href="https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8340">#8340</a>)</li> <li>The <code>Version()</code> function in <code>go.opentelemetry.io/contrib/instrumentation/github.com/gin-gonic/gin/otelgin</code> has been replaced by <code>const Version</code>. (<a href="https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8341">#8341</a>)</li> <li>The <code>Version()</code> function in <code>go.opentelemetry.io/contrib/instrumentation/runtime</code> has been replaced by <code>const Version</code> string. (<a href="https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8349">#8349</a>)</li> <li>The <code>Version()</code> function in <code>go.opentelemetry.io/contrib/instrumentation/github.com/aws/aws-sdk-go-v2/otelaws</code> has been replaced by <code>const Version</code>. (<a href="https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8356">#8356</a>)</li> <li>The <code>Version()</code> function in <code>go.opentelemetry.io/contrib/instrumentation/github.com/aws/aws-lambda-go/otellambda</code> has been replaced by <code>const Version</code>. (<a href="https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8357">#8357</a>)</li> <li>The <code>Version()</code> function in <code>go.opentelemetry.io/contrib/instrumentation/host</code> has been replaced by <code>const Version</code>. (<a href="https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8358">#8358</a>)</li> <li>The <code>Version()</code> function in <code>go.opentelemetry.io/contrib/instrumentation/github.com/emicklei/go-restful/otelrestful</code> has been replaced by <code>const Version</code>. (<a href="https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8360">#8360</a>)</li> <li>The <code>Version()</code> function in <code>go.opentelemetry.io/contrib/propagators/opencensus</code> has been replaced by <code>const Version</code>. (<a href="https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8361">#8361</a>)</li> <li>The <code>Version()</code> function in <code>go.opentelemetry.io/contrib/instrumentation/github.com/labstack/echo/otelecho</code> has been replaced by <code>const Version</code>. (<a href="https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8365">#8365</a>)</li> <li>The <code>Version()</code> function in <code>go.opentelemetry.io/contrib/samplers/probability/consistent</code> has been replaced by <code>const Version</code>. (<a href="https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8366">#8366</a>)</li> <li>The <code>Version()</code> function in <code>go.opentelemetry.io/contrib/instrumentation/go.mongodb.org/mongo-driver/v2/mongo/otelmongo</code> has been replaced by <code>const Version</code>. (<a href="https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8370">#8370</a>)</li> <li>Set <code>error.type</code> attribute instead of adding <code>exception</code> span events in <code>go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp</code>. (<a href="https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8386">#8386</a>)</li> <li>Set <code>error.type</code> attribute instead of adding <code>exception</code> span events in <code>go.opentelemetry.io/contrib/instrumentation/github.com/aws/aws-sdk-go-v2/otelaws</code>. (<a href="https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8386">#8386</a>)</li> <li>Upgrade <code>go.opentelemetry.io/otel/semconv</code> to <code>v1.39.0</code>, including updates across all instrumentation and detector modules. (<a href="https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8404">#8404</a>) <ul> <li>The semantic conventions v1.39.0 release introduces breaking changes, including: <ul> <li><code>rpc</code> span and metric attributes have been renamed to align with naming guidelines: <ul> <li><code>rpc.system</code> → <code>rpc.system.name</code> (values: <code>grpc</code>, <code>grpc_web</code>, <code>connectrpc</code>, <code>thrift</code>, <code>dubbo</code>, etc.)</li> <li><code>rpc.method</code> and <code>rpc.service</code> have been merged into a fully-qualified <code>rpc.method</code> attribute</li> <li><code>rpc.client|server.duration</code> → <code>rpc.client|server.call.duration</code> (unit changed to seconds)</li> <li><code>rpc.grpc.request.metadata</code>/<code>rpc.grpc.response.metadata</code> → <code>rpc.request.metadata</code>/<code>rpc.response.metadata</code></li> <li><code>rpc.grpc.status_code</code> → deprecated in favor of <code>rpc.response.status_code</code></li> <li><code>rpc.jsonrpc.request_id</code> → <code>jsonrpc.request.id</code></li> <li><code>rpc.jsonrpc.version</code> → <code>jsonrpc.protocol.version</code></li> </ul> </li> <li><code>system</code> and <code>process</code> metrics: <ul> <li><code>*.linux.memory</code> metrics renamed to <code>*.memory.linux</code></li> <li><code>system.process.status</code> → <code>process.state</code></li> </ul> </li> </ul> </li> </ul> </li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/open-telemetry/opentelemetry-go-contrib/blob/main/CHANGELOG.md">go.opentelemetry.io/contrib/instrumentation/runtime's changelog</a>.</em></p> <blockquote> <h2>[1.40.0/2.2.0/0.65.0/0.34.0/0.20.0/0.15.0/0.13.0/0.12.0] - 2026-02-02</h2> <h3>Added</h3> <ul> <li><code>WithMetricAttributesFn</code> option in <code>go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc</code> to define dynamic attributes on auto-instrumented metrics. (<a href="https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8191">#8191</a>)</li> <li>Add support for configuring propagators in <code>go.opentelemetry.io/contrib/otelconf</code>. (<a href="https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8281">#8281</a>)</li> <li>Add <code>const Version</code> in <code>go.opentelemetry.io/contrib/bridges/prometheus</code>. (<a href="https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8401">#8401</a>)</li> <li>Add <code>const Version</code> in <code>go.opentelemetry.io/contrib/otelconf</code>. (<a href="https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8461">#8461</a>)</li> <li>Add <code>const Version</code> in <code>go.opentelemetry.io/contrib/bridges/otellogr</code>. (<a href="https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8477">#8477</a>)</li> <li>Add <code>const Version</code> in <code>go.opentelemetry.io/contrib/bridges/otellogrus</code>. (<a href="https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8485">#8485</a>)</li> <li>Add <code>const Version</code> in <code>go.opentelemetry.io/contrib/bridges/otelslog</code>. (<a href="https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8480">#8480</a>)</li> </ul> <h3>Fixed</h3> <ul> <li>Fix panic when passing nil <code>TracerProvider</code> or <code>MeterProvider</code> to <code>WithTracerProvider</code> or <code>WithMeterProvider</code> in <code>go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc</code>. (<a href="https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8323">#8323</a>)</li> <li><code>Transport</code> in <code>go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp</code> now supports reading request body multiple times for subsequent requests that reuse <code>http.Request</code>. (<a href="https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8352">#8352</a>)</li> </ul> <h3>Changed</h3> <ul> <li>The <code>Version()</code> function in <code>go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp</code> has been replaced by <code>const Version</code>. (<a href="https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8142">#8142</a>)</li> <li>The <code>Version()</code> function in <code>go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace</code> has been replaced by <code>const Version</code>. (<a href="https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8302">#8302</a>)</li> <li>The <code>Version()</code> function in <code>go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc</code> has been replaced by <code>const Version</code>. (<a href="https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8317">#8317</a>)</li> <li>The <code>Version()</code> function in <code>go.opentelemetry.io/contrib/zpages</code> has been replaced by <code>const Version</code>. (<a href="https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8325">#8325</a>)</li> <li>The <code>Version()</code> function in <code>go.opentelemetry.io/contrib/instrumentation/go.mongodb.org/mongo-driver/mongo/otelmongo</code> has been replaced by <code>const Version</code>. (<a href="https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8340">#8340</a>)</li> <li>The <code>Version()</code> function in <code>go.opentelemetry.io/contrib/instrumentation/github.com/gin-gonic/gin/otelgin</code> has been replaced by <code>const Version</code>. (<a href="https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8341">#8341</a>)</li> <li>The <code>Version()</code> function in <code>go.opentelemetry.io/contrib/instrumentation/runtime</code> has been replaced by <code>const Version</code> string. (<a href="https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8349">#8349</a>)</li> <li>The <code>Version()</code> function in <code>go.opentelemetry.io/contrib/instrumentation/github.com/aws/aws-sdk-go-v2/otelaws</code> has been replaced by <code>const Version</code>. (<a href="https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8356">#8356</a>)</li> <li>The <code>Version()</code> function in <code>go.opentelemetry.io/contrib/instrumentation/github.com/aws/aws-lambda-go/otellambda</code> has been replaced by <code>const Version</code>. (<a href="https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8357">#8357</a>)</li> <li>The <code>Version()</code> function in <code>go.opentelemetry.io/contrib/instrumentation/host</code> has been replaced by <code>const Version</code>. (<a href="https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8358">#8358</a>)</li> <li>The <code>Version()</code> function in <code>go.opentelemetry.io/contrib/instrumentation/github.com/emicklei/go-restful/otelrestful</code> has been replaced by <code>const Version</code>. (<a href="https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8360">#8360</a>)</li> <li>The <code>Version()</code> function in <code>go.opentelemetry.io/contrib/propagators/opencensus</code> has been replaced by <code>const Version</code>. (<a href="https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8361">#8361</a>)</li> <li>The <code>Version()</code> function in <code>go.opentelemetry.io/contrib/instrumentation/github.com/labstack/echo/otelecho</code> has been replaced by <code>const Version</code>. (<a href="https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8365">#8365</a>)</li> <li>The <code>Version()</code> function in <code>go.opentelemetry.io/contrib/samplers/probability/consistent</code> has been replaced by <code>const Version</code>. (<a href="https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8366">#8366</a>)</li> <li>The <code>Version()</code> function in <code>go.opentelemetry.io/contrib/instrumentation/go.mongodb.org/mongo-driver/v2/mongo/otelmongo</code> has been replaced by <code>const Version</code>. (<a href="https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8370">#8370</a>)</li> <li>Set <code>error.type</code> attribute instead of adding <code>exception</code> span events in <code>go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp</code>. (<a href="https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8386">#8386</a>)</li> <li>Set <code>error.type</code> attribute instead of adding <code>exception</code> span events in <code>go.opentelemetry.io/contrib/instrumentation/github.com/aws/aws-sdk-go-v2/otelaws</code>. (<a href="https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8386">#8386</a>)</li> <li>Upgrade <code>go.opentelemetry.io/otel/semconv</code> to <code>v1.39.0</code>, including updates across all instrumentation and detector modules. (<a href="https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8404">#8404</a>) <ul> <li>The semantic conventions v1.39.0 release introduces breaking changes, including: <ul> <li><code>rpc</code> span and metric attributes have been renamed to align with naming guidelines: <ul> <li><code>rpc.system</code> → <code>rpc.system.name</code> (values: <code>grpc</code>, <code>grpc_web</code>, <code>connectrpc</code>, <code>thrift</code>, <code>dubbo</code>, etc.)</li> <li><code>rpc.method</code> and <code>rpc.service</code> have been merged into a fully-qualified <code>rpc.method</code> attribute</li> <li><code>rpc.client|server.duration</code> → <code>rpc.client|server.call.duration</code> (unit changed to seconds)</li> <li><code>rpc.grpc.request.metadata</code>/<code>rpc.grpc.response.metadata</code> → <code>rpc.request.metadata</code>/<code>rpc.response.metadata</code></li> <li><code>rpc.grpc.status_code</code> → deprecated in favor of <code>rpc.response.status_code</code></li> <li><code>rpc.jsonrpc.request_id</code> → <code>jsonrpc.request.id</code></li> <li><code>rpc.jsonrpc.version</code> → <code>jsonrpc.protocol.version</code></li> </ul> </li> <li><code>system</code> and <code>process</code> metrics: <ul> <li><code>*.linux.memory</code> metrics renamed to <code>*.memory.linux</code></li> <li><code>system.process.status</code> → <code>process.state</code></li> <li><code>system.paging.type</code> and <code>process.paging.fault_type</code> → <code>system.paging.fault.type</code></li> </ul> </li> </ul> </li> </ul> </li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="a89d958e7a"><code>a89d958</code></a> Release v1.40.0/v2.2.0/v0.65.0/v0.34.0/v0.20.0/v0.15.0/v0.13.0/v0.12.0 (<a href="https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8493">#8493</a>)</li> <li><a href="1530d71edc"><code>1530d71</code></a> Upgrade <code>semconv</code> to <code>v1.39.0</code> (<a href="https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8481">#8481</a>)</li> <li><a href="135bb6050e"><code>135bb60</code></a> Upgrade autoexport to latest otel dep (<a href="https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8483">#8483</a>)</li> <li><a href="8e921058c6"><code>8e92105</code></a> chore(deps): update module github.com/gabriel-vasile/mimetype to v1.4.13 (<a href="https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8486">#8486</a>)</li> <li><a href="147148e2d2"><code>147148e</code></a> fix(deps): update module github.com/shirou/gopsutil/v4 to v4.26.1 (<a href="https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8487">#8487</a>)</li> <li><a href="d387510eec"><code>d387510</code></a> Add version file for otellogrus bridge (<a href="https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8485">#8485</a>)</li> <li><a href="fad49c80d5"><code>fad49c8</code></a> add version file for otelslog bridge (<a href="https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8480">#8480</a>)</li> <li><a href="9e1e5731ae"><code>9e1e573</code></a> fix(deps): update module go.mongodb.org/mongo-driver to v1.17.8 (<a href="https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8479">#8479</a>)</li> <li><a href="37aa4753c9"><code>37aa475</code></a> Add version file for otellogr bridge (<a href="https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8477">#8477</a>)</li> <li><a href="fc8ef39de1"><code>fc8ef39</code></a> chore(deps): update module github.com/grpc-ecosystem/grpc-gateway/v2 to v2.27...</li> <li>Additional commits viewable in <a href="https://github.com/open-telemetry/opentelemetry-go-contrib/compare/zpages/v0.64.0...zpages/v0.65.0">compare view</a></li> </ul> </details> <br /> [](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) --- <details> <summary>Dependabot commands and options</summary> <br /> You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) </details> --------- Signed-off-by: dependabot[bot] <support@github.com> Signed-off-by: Radoslav Dimitrov <radoslav@stacklok.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Radoslav Dimitrov <radoslav@stacklok.com>
147 lines
4.1 KiB
Go
147 lines
4.1 KiB
Go
package telemetry
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"fmt"
|
|
"net/http"
|
|
|
|
"github.com/prometheus/client_golang/prometheus/promhttp"
|
|
"go.opentelemetry.io/contrib/instrumentation/runtime"
|
|
"go.opentelemetry.io/otel"
|
|
"go.opentelemetry.io/otel/exporters/prometheus"
|
|
"go.opentelemetry.io/otel/metric"
|
|
sdkmetric "go.opentelemetry.io/otel/sdk/metric"
|
|
"go.opentelemetry.io/otel/sdk/resource"
|
|
semconv "go.opentelemetry.io/otel/semconv/v1.17.0"
|
|
)
|
|
|
|
const (
|
|
Namespace = "mcp_registry"
|
|
)
|
|
|
|
type Metrics struct {
|
|
// Requests tracks the number of HTTP requests
|
|
Requests metric.Int64Counter
|
|
|
|
// RequestDuration tracks the duration of HTTP Requests
|
|
RequestDuration metric.Float64Histogram
|
|
|
|
// ErrorCount tracks the number of errors
|
|
ErrorCount metric.Int64Counter
|
|
|
|
// Up tracks the health of the service
|
|
Up metric.Int64Gauge
|
|
}
|
|
|
|
// ShutdownFunc is a delegate that shuts down the OpenTelemetry components.
|
|
type ShutdownFunc func(ctx context.Context) error
|
|
|
|
func NewMetrics(meter metric.Meter) (*Metrics, error) {
|
|
req, err := meter.Int64Counter(
|
|
Namespace+".http.requests",
|
|
metric.WithDescription("Total number of HTTP requests"),
|
|
)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("failed to create request counter: %w", err)
|
|
}
|
|
|
|
reqDuration, err := meter.Float64Histogram(
|
|
Namespace+".http.request.duration",
|
|
metric.WithDescription("Duration of HTTP requests in seconds"),
|
|
metric.WithExplicitBucketBoundaries(
|
|
0.005, 0.1, 0.25, 0.5, 1.0, 2.5, 5.0, 10.0, 20.0, 50.0,
|
|
),
|
|
)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("failed to create request duration histogram: %w", err)
|
|
}
|
|
|
|
errCount, err := meter.Int64Counter(
|
|
Namespace+".http.errors",
|
|
metric.WithDescription("Total number of HTTP errors"),
|
|
)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("failed to create error counter: %w", err)
|
|
}
|
|
|
|
up, err := meter.Int64Gauge(
|
|
Namespace+".service.up",
|
|
metric.WithDescription("Service health status (1 for up, 0 for down)"),
|
|
)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("failed to create service up gauge: %w", err)
|
|
}
|
|
|
|
return &Metrics{
|
|
Requests: req,
|
|
RequestDuration: reqDuration,
|
|
ErrorCount: errCount,
|
|
Up: up,
|
|
}, nil
|
|
}
|
|
|
|
func NewPrometheusMeterProvider(res *resource.Resource, exp *prometheus.Exporter) (*sdkmetric.MeterProvider, error) {
|
|
if exp == nil {
|
|
return nil, errors.New("exporter cannot be nil")
|
|
}
|
|
meterProvider := sdkmetric.NewMeterProvider(
|
|
sdkmetric.WithResource(res),
|
|
sdkmetric.WithReader(exp),
|
|
)
|
|
|
|
return meterProvider, nil
|
|
}
|
|
|
|
func InitMetrics(version string) (ShutdownFunc, *Metrics, error) {
|
|
// Initialized the returned shutdownFunc to no-op.
|
|
shutdown := func(_ context.Context) error { return nil }
|
|
|
|
res, err := resource.New(context.Background(),
|
|
resource.WithAttributes(
|
|
semconv.ServiceName(Namespace),
|
|
semconv.ServiceVersion(version),
|
|
),
|
|
resource.WithProcessRuntimeDescription(),
|
|
)
|
|
if err != nil {
|
|
return shutdown, nil, fmt.Errorf("failed to create resource: %w", err)
|
|
}
|
|
|
|
res, err = resource.Merge(resource.Default(), res)
|
|
if err != nil {
|
|
return shutdown, nil, fmt.Errorf("failed to merge resources: %w", err)
|
|
}
|
|
|
|
exporter, err := prometheus.New()
|
|
if err != nil {
|
|
return shutdown, nil, fmt.Errorf("failed to create Prometheus exporter: %w", err)
|
|
}
|
|
|
|
mp, err := NewPrometheusMeterProvider(res, exporter)
|
|
if err != nil {
|
|
return shutdown, nil, fmt.Errorf("failed to create Prometheus meter provider: %w", err)
|
|
}
|
|
otel.SetMeterProvider(mp)
|
|
|
|
// Update the returned shutdownFunc that calls metric provider
|
|
// shutdown methods and make sure that a non-nil error is returned
|
|
// if any returned an error.
|
|
shutdown = func(ctx context.Context) error {
|
|
var retErr error
|
|
if err := mp.Shutdown(ctx); err != nil {
|
|
retErr = err
|
|
}
|
|
return retErr
|
|
}
|
|
|
|
meter := mp.Meter(Namespace, metric.WithSchemaURL(semconv.SchemaURL), metric.WithInstrumentationVersion(runtime.Version))
|
|
metrics, err := NewMetrics(meter)
|
|
return shutdown, metrics, err
|
|
}
|
|
|
|
// PrometheusHandler returns the HTTP handler for Prometheus metrics
|
|
// This handler serves the metrics endpoint for Prometheus to scrape.
|
|
func (m *Metrics) PrometheusHandler() http.Handler {
|
|
return promhttp.Handler()
|
|
}
|