Skip to content

Commit bf92e40

Browse files
some tests
1 parent 543980f commit bf92e40

File tree

4 files changed

+145
-0
lines changed

4 files changed

+145
-0
lines changed

openfeature-provider/go/confidence/integration_test.go

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"context"
55
"log/slog"
66
"os"
7+
"strings"
78
"sync"
89
"sync/atomic"
910
"testing"
@@ -685,6 +686,74 @@ func TestIntegration_OpenFeatureObjectWithStructDefault(t *testing.T) {
685686
openfeature.Shutdown()
686687
}
687688

689+
func TestIntegration_GetPrometheusMetrics(t *testing.T) {
690+
// Load test state
691+
testState := tu.LoadTestResolverState(t)
692+
accountID := tu.LoadTestAccountID(t)
693+
694+
ctx := context.Background()
695+
696+
// Create mock state provider
697+
stateProvider := &mockStateProvider{
698+
state: testState,
699+
}
700+
701+
// Create tracking logger with actual GrpcWasmFlagLogger and mocked connection
702+
mockStub := &mockGrpcStubForIntegration{
703+
onCallReceived: make(chan struct{}, 100),
704+
}
705+
actualGrpcLogger := fl.NewGrpcWasmFlagLogger(mockStub, "mkjJruAATQWjeY7foFIWfVAcBWnci2YF", slog.New(slog.NewTextHandler(os.Stderr, nil)))
706+
707+
trackingLogger := &trackingFlagLogger{
708+
actualLogger: actualGrpcLogger,
709+
lastWriteCompleted: make(chan struct{}, 1),
710+
}
711+
712+
// Create provider with test state
713+
provider, err := createProviderWithTestState(ctx, stateProvider, accountID, trackingLogger, newUnsupportedMaterializationStore())
714+
if err != nil {
715+
t.Fatalf("Failed to create provider: %v", err)
716+
}
717+
718+
// Register with OpenFeature
719+
err = openfeature.SetProviderAndWait(provider)
720+
if err != nil {
721+
t.Fatalf("Failed to set provider: %v", err)
722+
}
723+
724+
client := openfeature.NewClient("prometheus-metrics-test")
725+
726+
evalCtx := openfeature.NewEvaluationContext(
727+
"tutorial_visitor",
728+
map[string]interface{}{
729+
"visitor_id": "tutorial_visitor",
730+
},
731+
)
732+
733+
// Resolve a flag to generate telemetry
734+
result, _ := client.ObjectValueDetails(ctx, "tutorial-feature", map[string]interface{}{}, evalCtx)
735+
t.Logf("Flag evaluation result: %+v", result)
736+
737+
// Get Prometheus metrics
738+
metrics, err := provider.GetPrometheusMetrics()
739+
if err != nil {
740+
t.Fatalf("GetPrometheusMetrics() returned error: %v", err)
741+
}
742+
743+
if metrics == "" {
744+
t.Fatal("GetPrometheusMetrics() returned empty string, expected metrics output")
745+
}
746+
747+
if !strings.Contains(metrics, "confidence_resolve_latency") {
748+
t.Errorf("Expected metrics to contain 'confidence_resolve_latency', got:\n%s", metrics)
749+
}
750+
751+
t.Logf("Prometheus metrics output:\n%s", metrics)
752+
753+
// Cleanup
754+
openfeature.Shutdown()
755+
}
756+
688757
// createProviderWithTestState creates a provider with mock state provider and tracking logger
689758
func createProviderWithTestState(
690759
ctx context.Context,

openfeature-provider/java/src/test/java/com/spotify/confidence/sdk/OpenFeatureLocalResolveProviderIntegrationTest.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -287,6 +287,25 @@ void testShutdownSendsAllLogData() throws Exception {
287287
.isGreaterThanOrEqualTo(numThreads * resolutionsPerThread);
288288
}
289289

290+
@Test
291+
void testGetPrometheusMetrics() throws Exception {
292+
provider.initialize(new ImmutableContext());
293+
294+
// Resolve a flag to generate telemetry data
295+
final ImmutableContext context =
296+
new ImmutableContext(
297+
"tutorial_visitor", Map.of("visitor_id", new Value("tutorial_visitor")));
298+
provider.getObjectEvaluation("tutorial-feature", new Value("default"), context);
299+
300+
// Retrieve Prometheus metrics
301+
final String metrics = provider.getPrometheusMetrics();
302+
303+
// Verify metrics are present and contain expected metric names
304+
assertThat(metrics).isNotNull();
305+
assertThat(metrics).isNotEmpty();
306+
assertThat(metrics).contains("confidence_resolve_latency");
307+
}
308+
290309
@Nested
291310
class WithOpenFeatureApis {
292311

openfeature-provider/js/src/ConfidenceServerProviderLocal.test.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -466,3 +466,16 @@ describe('SDK telemetry', () => {
466466
);
467467
});
468468
});
469+
470+
describe('getPrometheusMetrics', () => {
471+
it('calls prometheusSnapshot on the resolver and returns the result', async () => {
472+
await advanceTimersUntil(expect(provider.initialize()).resolves.toBeUndefined());
473+
474+
mockedWasmResolver.prometheusSnapshot.mockReturnValue('# HELP some_metric\nsome_metric 42\n');
475+
476+
const result = provider.getPrometheusMetrics();
477+
478+
expect(mockedWasmResolver.prometheusSnapshot).toHaveBeenCalledWith('0');
479+
expect(result).toBe('# HELP some_metric\nsome_metric 42\n');
480+
});
481+
});

openfeature-provider/python/tests/test_provider.py

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -795,3 +795,47 @@ def test_returns_default_on_error(
795795
assert result.reason == Reason.ERROR
796796
finally:
797797
provider.shutdown()
798+
799+
800+
class TestPrometheusMetrics:
801+
"""Tests for Prometheus metrics export."""
802+
803+
def test_get_prometheus_metrics(
804+
self,
805+
wasm_bytes: bytes,
806+
test_resolver_state: bytes,
807+
test_account_id: str,
808+
test_client_secret: str,
809+
) -> None:
810+
"""Test that get_prometheus_metrics returns metrics after resolution."""
811+
mock_fetcher = MockStateFetcher(test_resolver_state, test_account_id)
812+
mock_logger = MockFlagLogger()
813+
814+
provider = ConfidenceProvider(
815+
client_secret=test_client_secret,
816+
state_fetcher=mock_fetcher,
817+
flag_logger=mock_logger,
818+
wasm_bytes=wasm_bytes,
819+
)
820+
821+
provider.initialize(EvaluationContext())
822+
823+
try:
824+
# Resolve a flag to generate telemetry
825+
ctx = EvaluationContext(
826+
targeting_key="test-user",
827+
attributes={"visitor_id": "tutorial_visitor"},
828+
)
829+
provider.resolve_string_details(
830+
flag_key="tutorial-feature.message",
831+
default_value="default-message",
832+
evaluation_context=ctx,
833+
)
834+
835+
metrics = provider.get_prometheus_metrics()
836+
837+
assert isinstance(metrics, str)
838+
assert len(metrics) > 0
839+
assert "confidence_resolve_latency" in metrics
840+
finally:
841+
provider.shutdown()

0 commit comments

Comments
 (0)