以下是一个使用 OpenTelemetry Go SDK 实现聚合的简单示例:
package main
import (
"context"
"fmt"
"go.opentelemetry.io/otel/api/global"
"go.opentelemetry.io/otel/api/key"
"go.opentelemetry.io/otel/api/metric"
controller "go.opentelemetry.io/otel/sdk/metric/controller/basic"
exporter "go.opentelemetry.io/otel/sdk/metric/export/simple"
)
func main() {
ctx := context.Background()
pusher, controller, err := setupMetricController(ctx)
if err != nil {
panic(err)
}
defer pusher.Stop()
meter := global.Meter("example")
counter := metric.Must(meter).NewInt64Counter(
"example.counter",
metric.WithDescription("A simple counter"),
metric.WithUnit("1"),
)
err = meter.RecordBatch(
ctx,
[]attribute.KeyValue{key.String("key", "value")},
counter.Measurement(42),
)
if err != nil {
panic(err)
}
controller.Collect(ctx)
}
func setupMetricController(ctx context.Context) (*controller.PushController, *controller.Controller, error) {
exporter, err := exporter.New(
exporter.WithoutMemory(true),
exporter.WithLogging(false),
// This is the important bit - setting Aggregation to ExportKindAggregation.
exporter.WithAggregation(),
)
if err != nil {
return nil, nil, fmt.Errorf("failed to create new exporter: %w", err)
}
controller := controller.New(
exporter,
controller.WithCollectPeriod(10*time.Second),
)
pusher := controller.InstallNewPipeline(
// This sets up a basic set of default settings for you that will be sufficient in most cases.
controller.Config.Default(),
// Registering an ErrorHandler will allow you to handle errors that occur during the pipeline's run loop.
controller.WithErrorHandler(func(err error) {
fmt.Printf("Error reported: %v\n", err)
}),
)
return pusher, controller, nil
}
在这个例子中,我们创建了一个简单的计数器,并将其记录在 OpenTelemetry SDK 中。然后,我们调用 controller.Collect
函数来收集所有已经记录的度量值,并且将其聚合到一个时间窗口中。最后,我们通过控制器和导出器来推送数据以进行处理。
需要注意的是,在此示例中使用了默认设置。您可以根据自己的需求更改这些设置。例如,您可以更改聚合周期、启用内存缓存等等。