Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions core/services/gateway/monitoring/metrics.go
Original file line number Diff line number Diff line change
Expand Up @@ -84,8 +84,8 @@ func (m *GatewayMetrics) RecordKeepalivePongsReceived(ctx context.Context, nodeA
))
}

func (m *GatewayMetrics) RecordDONConnectionState(ctx context.Context, donID string, connected, required, configured int) {
attrs := metric.WithAttributes(attribute.String("donID", donID))
func (m *GatewayMetrics) RecordDONConnectionState(ctx context.Context, donShardID string, connected, required, configured int) {
attrs := metric.WithAttributes(attribute.String("donShardID", donShardID))
m.donConnectedNodes.Record(ctx, int64(connected), attrs)
m.donRequiredNodes.Record(ctx, int64(required), attrs)
m.donConfiguredNodes.Record(ctx, int64(configured), attrs)
Expand Down
40 changes: 28 additions & 12 deletions core/services/gateway/monitoring/metrics_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,16 +5,21 @@ import (
"testing"

"github.com/stretchr/testify/require"
"go.opentelemetry.io/otel/attribute"
sdkmetric "go.opentelemetry.io/otel/sdk/metric"
"go.opentelemetry.io/otel/sdk/metric/metricdata"
"go.opentelemetry.io/otel/sdk/resource"

"github.com/smartcontractkit/chainlink-common/pkg/beholder"
"github.com/smartcontractkit/chainlink-common/pkg/logger"
)

func TestGatewayMetrics_RecordReadiness(t *testing.T) { //nolint:paralleltest // The test replaces the process-global Beholder client.
reader := sdkmetric.NewManualReader()
meterProvider := sdkmetric.NewMeterProvider(sdkmetric.WithReader(reader))
meterProvider := sdkmetric.NewMeterProvider(
sdkmetric.WithReader(reader),
sdkmetric.WithResource(resource.NewSchemaless(attribute.String("donID", "cre-gateway-1"))),
)
t.Cleanup(func() { require.NoError(t, meterProvider.Shutdown(context.Background())) })

previousClient := beholder.GetClient()
Expand All @@ -26,14 +31,21 @@ func TestGatewayMetrics_RecordReadiness(t *testing.T) { //nolint:paralleltest //

metrics, err := NewGatewayMetrics()
require.NoError(t, err)
metrics.RecordDONConnectionState(t.Context(), "workflow_1_zone-a", 5, 7, 10)
metrics.RecordDONConnectionState(t.Context(), "workflow_1_zone-a", 4, 3, 4)
metrics.RecordDONConnectionState(t.Context(), "vault_1", 7, 5, 7)
metrics.RecordUserReady(t.Context(), true)

var resourceMetrics metricdata.ResourceMetrics
require.NoError(t, reader.Collect(t.Context(), &resourceMetrics))
requireGaugeValue(t, resourceMetrics, "platform_gateway_don_connected_nodes", 5, "workflow_1_zone-a")
requireGaugeValue(t, resourceMetrics, "platform_gateway_don_required_nodes", 7, "workflow_1_zone-a")
requireGaugeValue(t, resourceMetrics, "platform_gateway_don_configured_nodes", 10, "workflow_1_zone-a")
resourceDONID, ok := resourceMetrics.Resource.Set().Value("donID")
require.True(t, ok)
require.Equal(t, "cre-gateway-1", resourceDONID.AsString())
requireGaugeValue(t, resourceMetrics, "platform_gateway_don_connected_nodes", 4, "workflow_1_zone-a")
requireGaugeValue(t, resourceMetrics, "platform_gateway_don_connected_nodes", 7, "vault_1")
requireGaugeValue(t, resourceMetrics, "platform_gateway_don_required_nodes", 3, "workflow_1_zone-a")
requireGaugeValue(t, resourceMetrics, "platform_gateway_don_required_nodes", 5, "vault_1")
requireGaugeValue(t, resourceMetrics, "platform_gateway_don_configured_nodes", 4, "workflow_1_zone-a")
requireGaugeValue(t, resourceMetrics, "platform_gateway_don_configured_nodes", 7, "vault_1")
requireGaugeValue(t, resourceMetrics, "platform_gateway_user_ready", 1, "")

metrics.RecordUserReady(t.Context(), false)
Expand All @@ -50,14 +62,18 @@ func requireGaugeValue(t *testing.T, resourceMetrics metricdata.ResourceMetrics,
}
gauge, ok := metric.Data.(metricdata.Gauge[int64])
require.True(t, ok)
require.Len(t, gauge.DataPoints, 1)
require.Equal(t, want, gauge.DataPoints[0].Value)
if donID != "" {
attributeValue, ok := gauge.DataPoints[0].Attributes.Value("donID")
require.True(t, ok)
require.Equal(t, donID, attributeValue.AsString())
for _, dataPoint := range gauge.DataPoints {
if donID == "" {
require.Equal(t, want, dataPoint.Value)
return
}
attributeValue, ok := dataPoint.Attributes.Value("donShardID")
if ok && attributeValue.AsString() == donID {
require.Equal(t, want, dataPoint.Value)
return
}
}
return
t.Fatalf("metric %s has no datapoint for DON shard %s", name, donID)
}
}
t.Fatalf("metric %s not found", name)
Expand Down
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,7 @@ require (
go.opentelemetry.io/otel v1.44.0
go.opentelemetry.io/otel/log v0.20.0
go.opentelemetry.io/otel/metric v1.44.0
go.opentelemetry.io/otel/sdk v1.44.0
go.opentelemetry.io/otel/sdk/metric v1.44.0
go.opentelemetry.io/otel/trace v1.44.0
go.uber.org/atomic v1.11.0
Expand Down Expand Up @@ -392,7 +393,6 @@ require (
go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.19.0 // indirect
go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.43.0 // indirect
go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.43.0 // indirect
go.opentelemetry.io/otel/sdk v1.44.0 // indirect
go.opentelemetry.io/otel/sdk/log v0.20.0 // indirect
go.opentelemetry.io/proto/otlp v1.10.0 // indirect
go.uber.org/goleak v1.3.0 // indirect
Expand Down
Loading