77
88package org .elasticsearch .xpack .metrics ;
99
10+ import io .opentelemetry .api .common .AttributeKey ;
1011import io .opentelemetry .api .common .Attributes ;
1112import io .opentelemetry .api .metrics .Meter ;
1213import io .opentelemetry .exporter .otlp .http .metrics .OtlpHttpMetricExporter ;
14+ import io .opentelemetry .sdk .common .InstrumentationScopeInfo ;
1315import io .opentelemetry .sdk .metrics .SdkMeterProvider ;
16+ import io .opentelemetry .sdk .metrics .data .MetricData ;
1417import io .opentelemetry .sdk .metrics .export .PeriodicMetricReader ;
18+ import io .opentelemetry .sdk .metrics .internal .data .ImmutableDoublePointData ;
19+ import io .opentelemetry .sdk .metrics .internal .data .ImmutableGaugeData ;
20+ import io .opentelemetry .sdk .metrics .internal .data .ImmutableMetricData ;
21+ import io .opentelemetry .sdk .resources .Resource ;
1522
1623import org .elasticsearch .action .admin .cluster .node .info .NodeInfo ;
1724import org .elasticsearch .action .admin .cluster .node .info .NodesInfoResponse ;
4249
4350public class MetricsDBIndexingIT extends ESSingleNodeTestCase {
4451
52+ private OtlpHttpMetricExporter exporter ;
4553 private SdkMeterProvider meterProvider ;
4654
4755 @ Override
@@ -66,10 +74,7 @@ protected boolean addMockHttpTransport() {
6674 @ Override
6775 public void setUp () throws Exception {
6876 super .setUp ();
69- OtlpHttpMetricExporter exporter = OtlpHttpMetricExporter .builder ()
70- .setEndpoint ("http://localhost:" + getHttpPort () + "/_otlp/v1/metrics" )
71- .build ();
72-
77+ exporter = OtlpHttpMetricExporter .builder ().setEndpoint ("http://localhost:" + getHttpPort () + "/_otlp/v1/metrics" ).build ();
7378 meterProvider = SdkMeterProvider .builder ()
7479 .registerMetricReader (
7580 PeriodicMetricReader .builder (exporter )
@@ -98,7 +103,7 @@ public void tearDown() throws Exception {
98103 }
99104
100105 @ Test
101- public void testIngestMetric () {
106+ public void testIngestMetricViaMeterProvider () throws Exception {
102107 Meter sampleMeter = meterProvider .get ("io.opentelemetry.example.metrics" );
103108
104109 sampleMeter .gaugeBuilder ("jvm.memory.total" )
@@ -122,6 +127,42 @@ public void testIngestMetric() {
122127 }
123128 }
124129
130+ @ Test
131+ public void testIngestMetricDataViaMetricExporter () throws Exception {
132+ MetricData jvmMemoryMetricData = ImmutableMetricData .createDoubleGauge (
133+ Resource .create (Attributes .of (AttributeKey .stringKey ("service.name" ), "elasticsearch" )),
134+ InstrumentationScopeInfo .create ("io.opentelemetry.example.metrics" ),
135+ "jvm.memory.total" ,
136+ "Reports JVM memory usage." ,
137+ "By" ,
138+ ImmutableGaugeData .create (
139+ List .of (
140+ ImmutableDoublePointData .create (
141+ System .currentTimeMillis (),
142+ System .currentTimeMillis (),
143+ Attributes .empty (),
144+ Runtime .getRuntime ().totalMemory ()
145+ )
146+ )
147+ )
148+ );
149+
150+ var result = exporter .export (List .of (jvmMemoryMetricData )).join (1 , TimeUnit .SECONDS );
151+ assertThat (result .isSuccess (), is (true ));
152+
153+ admin ().indices ().prepareRefresh ().execute ().actionGet ();
154+ String [] indices = admin ().indices ().prepareGetIndex (TimeValue .timeValueSeconds (1 )).setIndices ("metrics*" ).get ().indices ();
155+ assertThat (indices , not (emptyArray ()));
156+
157+ try (EsqlQueryResponse resp = query ("""
158+ FROM metrics*
159+ | STATS avg(value_double) WHERE metric_name == "jvm.memory.total"
160+ """ )) {
161+ double avgJvmMemoryTotal = (double ) resp .column (0 ).next ();
162+ assertThat (avgJvmMemoryTotal , greaterThan (0.0 ));
163+ }
164+ }
165+
125166 protected EsqlQueryResponse query (String esql ) {
126167 return EsqlQueryRequestBuilder .newSyncEsqlQueryRequestBuilder (client ()).query (esql ).execute ().actionGet ();
127168 }
0 commit comments