88 lines
2.2 KiB
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),
|
|
),
|
|
)
|
|
}
|