Skip to content

Instantly share code, notes, and snippets.

@iamkirkbater
Created July 25, 2023 00:46
Show Gist options
  • Select an option

  • Save iamkirkbater/70d1bf28ac504f91dff9223a208e1a73 to your computer and use it in GitHub Desktop.

Select an option

Save iamkirkbater/70d1bf28ac504f91dff9223a208e1a73 to your computer and use it in GitHub Desktop.
Code Examples for bater.io/posts/2023/07/telemetry-in-go-readers/
package main
import (
"context"
"log"
"go.opentelemetry.io/otel"
"go.opentelemetry.io/otel/attribute"
"go.opentelemetry.io/otel/exporters/stdout/stdoutmetric"
"go.opentelemetry.io/otel/metric"
metricsdk "go.opentelemetry.io/otel/sdk/metric"
"go.opentelemetry.io/otel/sdk/metric/metricdata"
"go.opentelemetry.io/otel/sdk/resource"
semconv "go.opentelemetry.io/otel/semconv/v1.17.0"
)
var res = resource.NewWithAttributes(
semconv.SchemaURL,
semconv.ServiceName("runtime-instrumentation-example"),
)
func main() {
exp, err := stdoutmetric.New()
if err != nil {
log.Fatal(err)
}
// Register the exporter with an SDK via a periodic reader.
//read := metricsdk.NewPeriodicReader(exp, metricsdk.WithInterval(1*time.Second))
read := metricsdk.NewManualReader()
provider := metricsdk.NewMeterProvider(metricsdk.WithResource(res), metricsdk.WithReader(read))
defer func() {
err := provider.Shutdown(context.Background())
if err != nil {
log.Fatal(err)
}
}()
otel.SetMeterProvider(provider)
log.Print("Starting runtime instrumentation:")
m := otel.Meter("my.meter.name")
counter, _ := m.Int64Counter(
"some.prefix.counter",
metric.WithDescription("my-counter"),
metric.WithUnit("calls"),
)
counter.Add(context.TODO(), 1, metric.WithAttributes(
attribute.String("cmd", "root")),
)
collectedMetrics := &metricdata.ResourceMetrics{}
read.Collect(context.TODO(), collectedMetrics)
exp.Export(context.TODO(), collectedMetrics)
}
// This can also be found at https://github.com/iamkirkbater/opentelemetry-go-examples/blob/000dde799d77ef1f1efa4639c671d4772bd8998a/metric-test.go
package main
import (
"context"
"log"
"go.opentelemetry.io/otel"
"go.opentelemetry.io/otel/attribute"
"go.opentelemetry.io/otel/exporters/stdout/stdoutmetric"
"go.opentelemetry.io/otel/metric"
metricsdk "go.opentelemetry.io/otel/sdk/metric"
"go.opentelemetry.io/otel/sdk/metric/metricdata"
"go.opentelemetry.io/otel/sdk/resource"
semconv "go.opentelemetry.io/otel/semconv/v1.17.0"
)
var res = resource.NewWithAttributes(
semconv.SchemaURL,
semconv.ServiceName("runtime-instrumentation-example"),
)
var metricReader = metricsdk.NewManualReader()
func setup_metrics() func() {
provider := metricsdk.NewMeterProvider(metricsdk.WithResource(res), metricsdk.WithReader(metricReader))
otel.SetMeterProvider(provider)
return func() {
err := provider.Shutdown(context.Background())
if err != nil {
log.Fatal(err)
}
}
}
func closeout_metrics(ctx context.Context) {
exp, err := stdoutmetric.New()
if err != nil {
log.Fatal(err)
}
collectedMetrics := &metricdata.ResourceMetrics{}
metricReader.Collect(ctx, collectedMetrics)
exp.Export(ctx, collectedMetrics)
}
func main() {
ctx := context.TODO()
shutdown := setup_metrics()
defer shutdown()
log.Print("Starting runtime instrumentation:")
m := otel.Meter("my.meter.name")
counter, _ := m.Int64Counter(
"some.prefix.counter",
metric.WithDescription("my-counter"),
metric.WithUnit("calls"),
)
counter.Add(ctx, 1, metric.WithAttributes(
attribute.String("cmd", "root")),
)
closeout_metrics(ctx)
}
// This can also be found at https://github.com/iamkirkbater/opentelemetry-go-examples/blob/b2d4789d3f6ff1b9b9537562ecf4004a41964391/metric-test.go
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment