otelchi/metrics.go

88 lines
2.2 KiB
Go

package otelchi
import (
"context"
"fmt"
"time"
"go.opentelemetry.io/otel/attribute"
otelmetric "go.opentelemetry.io/otel/metric"
)
var (
serviceKey = attribute.Key("service")
idKey = attribute.Key("id")
methodKey = attribute.Key("method")
codeKey = attribute.Key("code")
)
type httpReqProperties struct {
Service string
ID string
Method string
Code int
}
func newMetricsRecorder(meter otelmetric.Meter) *metricsRecorder {
httpRequestDurHistogram, err := meter.Int64Histogram("request_duration_seconds")
if err != nil {
panic(fmt.Sprintf("failed to create request_duration_seconds histogram: %v", err))
}
httpResponseSizeHistogram, err := meter.Int64Histogram("response_size_bytes")
if err != nil {
panic(fmt.Sprintf("failed to create response_size_bytes histogram: %v", err))
}
httpRequestsInflight, err := meter.Int64UpDownCounter("requests_inflight")
if err != nil {
panic(fmt.Sprintf("failed to create requests_inflight counter: %v", err))
}
return &metricsRecorder{
httpRequestDurHistogram: httpRequestDurHistogram,
httpResponseSizeHistogram: httpResponseSizeHistogram,
httpRequestsInflight: httpRequestsInflight,
}
}
type metricsRecorder struct {
httpRequestDurHistogram otelmetric.Int64Histogram
httpResponseSizeHistogram otelmetric.Int64Histogram
httpRequestsInflight otelmetric.Int64UpDownCounter
}
func (r *metricsRecorder) RecordRequestDuration(ctx context.Context, p httpReqProperties, duration time.Duration) {
r.httpRequestDurHistogram.Record(ctx,
int64(duration.Seconds()),
otelmetric.WithAttributes(
serviceKey.String(p.Service),
idKey.String(p.ID),
methodKey.String(p.Method),
codeKey.Int(p.Code),
),
)
}
func (r *metricsRecorder) RecordResponseSize(ctx context.Context, p httpReqProperties, size int64) {
r.httpResponseSizeHistogram.Record(ctx,
size,
otelmetric.WithAttributes(
serviceKey.String(p.Service),
idKey.String(p.ID),
methodKey.String(p.Method),
codeKey.Int(p.Code),
),
)
}
func (r *metricsRecorder) RecordRequestsInflight(ctx context.Context, p httpReqProperties, count int64) {
r.httpRequestsInflight.Add(ctx,
count,
otelmetric.WithAttributes(
serviceKey.String(p.Service),
idKey.String(p.ID),
methodKey.String(p.Method),
),
)
}