Skip to content

Commit 15546ff

Browse files
authored
Adding http exporting path (#319)
* Adding http exporting path * Updated changelog
1 parent 2edb054 commit 15546ff

File tree

5 files changed

+140
-6
lines changed

5 files changed

+140
-6
lines changed

CHANGELOG.asciidoc

+2-2
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,9 @@ ${next_release_notes}
3030
==== ${version} - ${release_date}
3131

3232
[float]
33-
===== Features
33+
===== Bug fixes
3434

35-
* New feature: {pull}000[#000]
35+
* HTTP exporting fix: {pull}319[#319]
3636
////
3737
3838
[[release-notes-0.17.0]]

android-sdk/build.gradle

+2
Original file line numberDiff line numberDiff line change
@@ -59,4 +59,6 @@ dependencies {
5959
compileOnly 'co.elastic.apm.compile:processor'
6060
testImplementation libs.bundles.mocking
6161
testImplementation libs.junit
62+
testImplementation libs.mockwebserver
63+
testImplementation libs.opentelemetry.testing
6264
}

android-sdk/src/main/java/co/elastic/apm/android/sdk/connectivity/opentelemetry/DefaultSignalConfiguration.java

+12-4
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,11 @@ public final class DefaultSignalConfiguration extends DefaultSignalProcessorConf
4747
private final Provider<ConnectivityConfiguration> connectivity;
4848

4949
public DefaultSignalConfiguration() {
50-
connectivity = LazyProvider.of(() -> Configurations.get(ConnectivityConfiguration.class));
50+
this(LazyProvider.of(() -> Configurations.get(ConnectivityConfiguration.class)));
51+
}
52+
53+
DefaultSignalConfiguration(Provider<ConnectivityConfiguration> connectivity) {
54+
this.connectivity = connectivity;
5155
}
5256

5357
@Override
@@ -117,7 +121,7 @@ private OtlpGrpcMetricExporter getOtlpGrpcMetricExporter() {
117121

118122
@NonNull
119123
private OtlpHttpSpanExporter getOtlpHttpSpanExporter() {
120-
OtlpHttpSpanExporterBuilder exporterBuilder = OtlpHttpSpanExporter.builder().setEndpoint(getConnectivity().getEndpoint());
124+
OtlpHttpSpanExporterBuilder exporterBuilder = OtlpHttpSpanExporter.builder().setEndpoint(getHttpEndpoint("traces"));
121125
if (getConnectivity().getAuthConfiguration() != null) {
122126
exporterBuilder.addHeader(AUTHORIZATION_HEADER_NAME, getAuthorizationHeaderValue());
123127
}
@@ -126,7 +130,7 @@ private OtlpHttpSpanExporter getOtlpHttpSpanExporter() {
126130

127131
@NonNull
128132
private OtlpHttpLogRecordExporter getOtlpHttpLogRecordExporter() {
129-
OtlpHttpLogRecordExporterBuilder exporterBuilder = OtlpHttpLogRecordExporter.builder().setEndpoint(getConnectivity().getEndpoint());
133+
OtlpHttpLogRecordExporterBuilder exporterBuilder = OtlpHttpLogRecordExporter.builder().setEndpoint(getHttpEndpoint("logs"));
130134
if (getConnectivity().getAuthConfiguration() != null) {
131135
exporterBuilder.addHeader(AUTHORIZATION_HEADER_NAME, getAuthorizationHeaderValue());
132136
}
@@ -137,7 +141,7 @@ private OtlpHttpLogRecordExporter getOtlpHttpLogRecordExporter() {
137141
private OtlpHttpMetricExporter getOtlpHttpMetricExporter() {
138142
OtlpHttpMetricExporterBuilder exporterBuilder = OtlpHttpMetricExporter.builder()
139143
.setAggregationTemporalitySelector(AggregationTemporalitySelector.deltaPreferred())
140-
.setEndpoint(getConnectivity().getEndpoint());
144+
.setEndpoint(getHttpEndpoint("metrics"));
141145
if (getConnectivity().getAuthConfiguration() != null) {
142146
exporterBuilder.addHeader(AUTHORIZATION_HEADER_NAME, getAuthorizationHeaderValue());
143147
}
@@ -152,4 +156,8 @@ private ConnectivityConfiguration getConnectivity() {
152156
private String getAuthorizationHeaderValue() {
153157
return getConnectivity().getAuthConfiguration().asAuthorizationHeaderValue();
154158
}
159+
160+
private String getHttpEndpoint(String signalId) {
161+
return String.format("%s/v1/%s", getConnectivity().getEndpoint(), signalId);
162+
}
155163
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
1+
/*
2+
* Licensed to Elasticsearch B.V. under one or more contributor
3+
* license agreements. See the NOTICE file distributed with
4+
* this work for additional information regarding copyright
5+
* ownership. Elasticsearch B.V. licenses this file to you under
6+
* the Apache License, Version 2.0 (the "License"); you may
7+
* not use this file except in compliance with the License.
8+
* You may obtain a copy of the License at
9+
*
10+
* http://www.apache.org/licenses/LICENSE-2.0
11+
*
12+
* Unless required by applicable law or agreed to in writing,
13+
* software distributed under the License is distributed on an
14+
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15+
* KIND, either express or implied. See the License for the
16+
* specific language governing permissions and limitations
17+
* under the License.
18+
*/
19+
package co.elastic.apm.android.sdk.connectivity.opentelemetry;
20+
21+
import static org.junit.Assert.assertEquals;
22+
import static org.mockito.Mockito.doReturn;
23+
import static org.mockito.Mockito.mock;
24+
25+
import org.junit.After;
26+
import org.junit.Before;
27+
import org.junit.Test;
28+
29+
import java.io.IOException;
30+
import java.util.Collections;
31+
import java.util.concurrent.TimeUnit;
32+
33+
import co.elastic.apm.android.sdk.connectivity.ExportProtocol;
34+
import co.elastic.apm.android.sdk.internal.configuration.impl.ConnectivityConfiguration;
35+
import co.elastic.apm.android.sdk.testutils.providers.SimpleProvider;
36+
import io.opentelemetry.api.trace.SpanKind;
37+
import io.opentelemetry.sdk.common.InstrumentationScopeInfo;
38+
import io.opentelemetry.sdk.metrics.data.MetricData;
39+
import io.opentelemetry.sdk.metrics.internal.data.ImmutableMetricData;
40+
import io.opentelemetry.sdk.metrics.internal.data.ImmutableSumData;
41+
import io.opentelemetry.sdk.resources.Resource;
42+
import io.opentelemetry.sdk.testing.logs.TestLogRecordData;
43+
import io.opentelemetry.sdk.testing.trace.TestSpanData;
44+
import io.opentelemetry.sdk.trace.data.StatusData;
45+
import okhttp3.mockwebserver.MockResponse;
46+
import okhttp3.mockwebserver.MockWebServer;
47+
import okhttp3.mockwebserver.RecordedRequest;
48+
49+
public class DefaultSignalConfigurationTest {
50+
51+
private MockWebServer server;
52+
private ConnectivityConfiguration connectivityConfiguration;
53+
private DefaultSignalConfiguration signalConfiguration;
54+
55+
@Before
56+
public void setUp() throws IOException {
57+
server = new MockWebServer();
58+
server.start();
59+
server.enqueue(new MockResponse());
60+
61+
connectivityConfiguration = mock();
62+
doReturn("http://" + server.getHostName() + ":" + server.getPort()).when(connectivityConfiguration).getEndpoint();
63+
signalConfiguration = new DefaultSignalConfiguration(SimpleProvider.create(connectivityConfiguration));
64+
}
65+
66+
@Test
67+
public void testSpansHttpEndpoint() throws InterruptedException {
68+
doReturn(ExportProtocol.HTTP).when(connectivityConfiguration).getExportProtocol();
69+
TestSpanData spanData = getTestSpanData();
70+
71+
signalConfiguration.provideSpanExporter().export(Collections.singleton(spanData)).join(1, TimeUnit.SECONDS);
72+
73+
RecordedRequest recordedRequest = server.takeRequest();
74+
assertEquals("/v1/traces", recordedRequest.getPath());
75+
}
76+
77+
@Test
78+
public void testMetricsHttpEndpoint() throws InterruptedException {
79+
doReturn(ExportProtocol.HTTP).when(connectivityConfiguration).getExportProtocol();
80+
MetricData metricData = getTestMetricData();
81+
82+
signalConfiguration.provideMetricExporter().export(Collections.singleton(metricData)).join(1, TimeUnit.SECONDS);
83+
84+
RecordedRequest recordedRequest = server.takeRequest();
85+
assertEquals("/v1/metrics", recordedRequest.getPath());
86+
}
87+
88+
@Test
89+
public void testLogRecordsHttpEndpoint() throws InterruptedException {
90+
doReturn(ExportProtocol.HTTP).when(connectivityConfiguration).getExportProtocol();
91+
TestLogRecordData logRecordData = TestLogRecordData.builder().setBody("Log body").build();
92+
93+
signalConfiguration.provideLogExporter().export(Collections.singleton(logRecordData)).join(1, TimeUnit.SECONDS);
94+
95+
RecordedRequest recordedRequest = server.takeRequest();
96+
assertEquals("/v1/logs", recordedRequest.getPath());
97+
}
98+
99+
private static TestSpanData getTestSpanData() {
100+
return TestSpanData.builder().setName("Some name")
101+
.setStartEpochNanos(1000)
102+
.setEndEpochNanos(1100)
103+
.setHasEnded(true)
104+
.setStatus(StatusData.ok())
105+
.setKind(SpanKind.CLIENT)
106+
.build();
107+
}
108+
109+
private static MetricData getTestMetricData() {
110+
return ImmutableMetricData.createLongSum(Resource.empty(),
111+
InstrumentationScopeInfo.empty(),
112+
"A Metric",
113+
"A description",
114+
"m",
115+
ImmutableSumData.empty());
116+
}
117+
118+
@After
119+
public void tearDown() throws IOException {
120+
server.shutdown();
121+
}
122+
}

gradle/libs.versions.toml

+2
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ kotlin-coroutines = "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4"
3838
mockito-core = { module = "org.mockito:mockito-core", version.ref = "mockito" }
3939
mockito-inline = { module = "org.mockito:mockito-inline", version.ref = "mockito" }
4040
junit = "junit:junit:4.13.2"
41+
mockwebserver = "com.squareup.okhttp3:mockwebserver:4.12.0"
42+
opentelemetry-testing = { module = "io.opentelemetry:opentelemetry-sdk-testing", version.ref = "opentelemetry" }
4143

4244
#Compilation tools
4345
apache-commons-text = "org.apache.commons:commons-text:1.10.0"

0 commit comments

Comments
 (0)