我尝试使用go-sdk将指标推送到opentelemetry,但我没有找到任何关于doc的信息。到目前为止,我尝试使用此代码,但不知道下一步是什么,老实说,我对提供程序和读取器有些困惑,我是监视方面的新手
func main() {
ctx := context.Background()
res, err := resource.New(ctx, resource.WithAttributes(semconv.ServiceName("my-service")))
if err != nil {
panic(err)
}
ctx, cancel := context.WithTimeout(ctx, time.Second)
defer cancel()
conn, err := grpc.DialContext(ctx, "localhost:4317", grpc.WithTransportCredentials(insecure.NewCredentials()), grpc.WithBlock())
if err != nil {
panic(err)
}
metricExporter, err := otlpmetricgrpc.New(ctx, otlpmetricgrpc.WithGRPCConn(conn))
if err != nil {
panic(err)
}
exporter, err := prometheus.New()
if err != nil {
panic(err)
}
provider := metric.NewMeterProvider(metric.WithReader(exporter))
meter := provider.Meter("github.com/open-telemetry/opentelemetry-go/example/prometheus")
counter, err := meter.Float64Counter("foo", instrument.WithDescription("a simple counter"))
if err != nil {
panic(err)
}
counter.Add(ctx, 5)
reader := metric.NewPeriodicReader(metricExporter, metric.WithInterval(1*time.Second))
}
到目前为止,源信息I从这里X1 E0 F1 X到这里X1 E1 F1 X
1条答案
按热度按时间yzxexxkh1#
首先,值得注意的是,OTelGo指标API和SDK目前并不稳定。我将尽量把我的答案集中在稳定的OpenTelemetry指标规范中包含的更高级别的项目上,以免它过时。以下任何与Go相关的内容都可能发生变化。
看起来您正在尝试设置两种不同类型的导出器。Prometheus导出器由Prometheus抓取,而
otelmetricgrpc
导出器创建一个连接,通过OTLP将指标推送到OpenTelemetry Collector等接收器。您可能只需要其中一个,而不是两个都需要。您链接的第一个样本实际上仅用于跟踪,而不是指标,但原理基本相同。任何OpenTelemetry SDK中度量的入口点都是
meter provider
。度量提供程序处理与度量相关的配置以及数据的聚合和导出。这也是用户获取meters
的方式。每个代码模块通常都有自己的度量。从该度量创建度量,并从这些度量记录数据点。所有度量点聚合在一起,并通过度量提供程序流回。为了从计量提供商读取指标,您需要某种类型的
metric reader
。如果您尝试使用OTLP等协议推送指标,您将使用类似定期导出指标读取器的工具,定期从计量提供商收集指标并使用导出器导出它们。如果你尝试使用像普罗米修斯那样的基于拉力的度量系统,导出器充当度量读取器,并在度量系统每次请求刮擦端点时读取度量。这是在您链接的第二个示例中完成的操作。
serveMetrics
函数打开一个侦听端口2223并处理对localhost:2223/metrics
的请求的Web服务器。每次GET
请求到达该端点时,度量将根据度量提供程序配置进行聚合,并在响应正文中返回,这允许像Prometheus这样的系统定期从应用程序请求度量。