Skip to content

Commit 03f9ecc

Browse files
GaganjunejaGagan Juneja
authored andcommitted
Adds mock implementation for TelemetryPlugin (opensearch-project#8357)
--------- Signed-off-by: Gagan Juneja <gjjuneja@amazon.com> Signed-off-by: Gagan Juneja <gagandeepjuneja@gmail.com> Co-authored-by: Gagan Juneja <gjjuneja@amazon.com> Signed-off-by: Shivansh Arora <hishiv@amazon.com>
1 parent de3b04a commit 03f9ecc

15 files changed

Lines changed: 504 additions & 2 deletions

File tree

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
9696
- Add distributed tracing framework ([#7543](https://github.com/opensearch-project/OpenSearch/issues/7543))
9797
- Enable Point based optimization for custom comparators ([#8168](https://github.com/opensearch-project/OpenSearch/pull/8168))
9898
- [Extensions] Support extension additional settings with extension REST initialization ([#8414](https://github.com/opensearch-project/OpenSearch/pull/8414))
99+
- Adds mock implementation for TelemetryPlugin ([#7545](https://github.com/opensearch-project/OpenSearch/issues/7545))
99100

100101
### Dependencies
101102
- Bump `com.azure:azure-storage-common` from 12.21.0 to 12.21.1 (#7566, #7814)

server/src/main/java/org/opensearch/node/Node.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1501,7 +1501,7 @@ public synchronized void close() throws IOException {
15011501
toClose.add(injector.getInstance(NodeEnvironment.class));
15021502
toClose.add(stopWatch::stop);
15031503
if (FeatureFlags.isEnabled(TELEMETRY)) {
1504-
toClose.add(() -> injector.getInstance(TracerFactory.class));
1504+
toClose.add(injector.getInstance(TracerFactory.class));
15051505
}
15061506

15071507
if (logger.isTraceEnabled()) {

settings.gradle

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,8 @@ List projects = [
8787
'test:fixtures:minio-fixture',
8888
'test:fixtures:old-elasticsearch',
8989
'test:fixtures:s3-fixture',
90-
'test:logger-usage'
90+
'test:logger-usage',
91+
'test:telemetry'
9192
]
9293

9394
/**

test/framework/build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ dependencies {
3838
api project(':libs:opensearch-nio')
3939
api project(":server")
4040
api project(":libs:opensearch-cli")
41+
api project(":test:telemetry")
4142
api "com.carrotsearch.randomizedtesting:randomizedtesting-runner:${versions.randomizedrunner}"
4243
api "junit:junit:${versions.junit}"
4344
api "org.hamcrest:hamcrest:${versions.hamcrest}"

test/framework/src/main/java/org/opensearch/test/OpenSearchIntegTestCase.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,7 @@
109109
import org.opensearch.common.unit.ByteSizeUnit;
110110
import org.opensearch.common.unit.ByteSizeValue;
111111
import org.opensearch.common.unit.TimeValue;
112+
import org.opensearch.common.util.FeatureFlags;
112113
import org.opensearch.common.util.concurrent.ThreadContext;
113114
import org.opensearch.common.xcontent.XContentHelper;
114115
import org.opensearch.common.xcontent.XContentType;
@@ -152,6 +153,7 @@
152153
import org.opensearch.test.disruption.ServiceDisruptionScheme;
153154
import org.opensearch.test.store.MockFSIndexStore;
154155
import org.opensearch.test.transport.MockTransportService;
156+
import org.opensearch.test.telemetry.MockTelemetryPlugin;
155157
import org.opensearch.transport.TransportInterceptor;
156158
import org.opensearch.transport.TransportRequest;
157159
import org.opensearch.transport.TransportRequestHandler;
@@ -776,6 +778,7 @@ protected Settings featureFlagSettings() {
776778
for (Setting builtInFlag : FeatureFlagSettings.BUILT_IN_FEATURE_FLAGS) {
777779
featureSettings.put(builtInFlag.getKey(), builtInFlag.getDefaultRaw(Settings.EMPTY));
778780
}
781+
featureSettings.put(FeatureFlags.TELEMETRY_SETTING.getKey(), true);
779782
return featureSettings.build();
780783
}
781784

@@ -2101,6 +2104,7 @@ protected Collection<Class<? extends Plugin>> getMockPlugins() {
21012104
if (addMockGeoShapeFieldMapper()) {
21022105
mocks.add(TestGeoShapeFieldMapperPlugin.class);
21032106
}
2107+
mocks.add(MockTelemetryPlugin.class);
21042108

21052109
return Collections.unmodifiableList(mocks);
21062110
}

test/framework/src/main/java/org/opensearch/test/OpenSearchSingleNodeTestCase.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
import org.opensearch.common.settings.Settings;
4949
import org.opensearch.common.unit.TimeValue;
5050
import org.opensearch.common.util.BigArrays;
51+
import org.opensearch.common.util.FeatureFlags;
5152
import org.opensearch.common.util.concurrent.OpenSearchExecutors;
5253
import org.opensearch.common.util.io.IOUtils;
5354
import org.opensearch.core.common.Strings;
@@ -66,6 +67,8 @@
6667
import org.opensearch.plugins.Plugin;
6768
import org.opensearch.script.MockScriptService;
6869
import org.opensearch.search.internal.SearchContext;
70+
import org.opensearch.telemetry.TelemetrySettings;
71+
import org.opensearch.test.telemetry.MockTelemetryPlugin;
6972
import org.opensearch.transport.TransportSettings;
7073
import org.junit.AfterClass;
7174
import org.junit.BeforeClass;
@@ -242,6 +245,8 @@ private Node newNode() {
242245
.put(HierarchyCircuitBreakerService.USE_REAL_MEMORY_USAGE_SETTING.getKey(), false)
243246
.putList(DISCOVERY_SEED_HOSTS_SETTING.getKey()) // empty list disables a port scan for other nodes
244247
.putList(INITIAL_CLUSTER_MANAGER_NODES_SETTING.getKey(), nodeName)
248+
.put(FeatureFlags.TELEMETRY_SETTING.getKey(), true)
249+
.put(TelemetrySettings.TRACER_ENABLED_SETTING.getKey(), true)
245250
.put(nodeSettings()) // allow test cases to provide their own settings or override these
246251
.build();
247252

@@ -254,6 +259,7 @@ private Node newNode() {
254259
plugins.add(MockHttpTransport.TestPlugin.class);
255260
}
256261
plugins.add(MockScriptService.TestPlugin.class);
262+
plugins.add(MockTelemetryPlugin.class);
257263
Node node = new MockNode(settings, plugins, forbidPrivateIndexSettings());
258264
try {
259265
node.start();
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
/*
2+
* SPDX-License-Identifier: Apache-2.0
3+
*
4+
* The OpenSearch Contributors require contributions made to
5+
* this file be licensed under the Apache-2.0 license or a
6+
* compatible open source license.
7+
*/
8+
9+
package org.opensearch.test.telemetry;
10+
11+
import org.opensearch.telemetry.Telemetry;
12+
import org.opensearch.telemetry.TelemetrySettings;
13+
import org.opensearch.telemetry.metrics.MetricsTelemetry;
14+
import org.opensearch.test.telemetry.tracing.MockTracingTelemetry;
15+
import org.opensearch.telemetry.tracing.TracingTelemetry;
16+
17+
/**
18+
* Mock {@link Telemetry} implementation for testing.
19+
*/
20+
public class MockTelemetry implements Telemetry {
21+
22+
private final TelemetrySettings settings;
23+
24+
/**
25+
* Constructor with settings.
26+
* @param settings telemetry settings.
27+
*/
28+
public MockTelemetry(TelemetrySettings settings) {
29+
this.settings = settings;
30+
}
31+
32+
@Override
33+
public TracingTelemetry getTracingTelemetry() {
34+
return new MockTracingTelemetry();
35+
}
36+
37+
@Override
38+
public MetricsTelemetry getMetricsTelemetry() {
39+
return new MetricsTelemetry() {
40+
};
41+
}
42+
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
/*
2+
* SPDX-License-Identifier: Apache-2.0
3+
*
4+
* The OpenSearch Contributors require contributions made to
5+
* this file be licensed under the Apache-2.0 license or a
6+
* compatible open source license.
7+
*/
8+
9+
package org.opensearch.test.telemetry;
10+
11+
import java.util.Optional;
12+
import org.opensearch.plugins.Plugin;
13+
import org.opensearch.plugins.TelemetryPlugin;
14+
import org.opensearch.telemetry.Telemetry;
15+
import org.opensearch.telemetry.TelemetrySettings;
16+
17+
/**
18+
* Mock {@link TelemetryPlugin} implementation for testing.
19+
*/
20+
public class MockTelemetryPlugin extends Plugin implements TelemetryPlugin {
21+
private static final String MOCK_TRACER_NAME = "mock";
22+
23+
/**
24+
* Base constructor.
25+
*/
26+
public MockTelemetryPlugin() {
27+
28+
}
29+
30+
@Override
31+
public Optional<Telemetry> getTelemetry(TelemetrySettings settings) {
32+
return Optional.of(new MockTelemetry(settings));
33+
}
34+
35+
@Override
36+
public String getName() {
37+
return MOCK_TRACER_NAME;
38+
}
39+
}

test/telemetry/build.gradle

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
/*
2+
* SPDX-License-Identifier: Apache-2.0
3+
*
4+
* The OpenSearch Contributors require contributions made to
5+
* this file be licensed under the Apache-2.0 license or a
6+
* compatible open source license.
7+
*
8+
* Modifications Copyright OpenSearch Contributors. See
9+
* GitHub history for details.
10+
*/
11+
12+
apply plugin: 'opensearch.build'
13+
apply plugin: 'opensearch.publish'
14+
15+
dependencies {
16+
api project(":libs:opensearch-common")
17+
api project(":libs:opensearch-telemetry")
18+
}
19+
20+
tasks.named('forbiddenApisMain').configure {
21+
//package does not depend on core, so only jdk signatures should be checked
22+
replaceSignatureFiles 'jdk-signatures'
23+
}
24+
25+
test.enabled = false
Lines changed: 159 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,159 @@
1+
/*
2+
* SPDX-License-Identifier: Apache-2.0
3+
*
4+
* The OpenSearch Contributors require contributions made to
5+
* this file be licensed under the Apache-2.0 license or a
6+
* compatible open source license.
7+
*/
8+
9+
package org.opensearch.test.telemetry.tracing;
10+
11+
import java.util.HashMap;
12+
import java.util.Map;
13+
import java.util.Random;
14+
import java.util.concurrent.ThreadLocalRandom;
15+
import java.util.function.Supplier;
16+
import org.opensearch.telemetry.tracing.AbstractSpan;
17+
import org.opensearch.telemetry.tracing.Span;
18+
19+
/**
20+
* MockSpan for testing and strict check validations. Not to be used for production cases.
21+
*/
22+
public class MockSpan extends AbstractSpan {
23+
private final SpanProcessor spanProcessor;
24+
private final Map<String, Object> metadata;
25+
private final String traceId;
26+
private final String spanId;
27+
private boolean hasEnded;
28+
private final Long startTime;
29+
private Long endTime;
30+
31+
private final Object lock = new Object();
32+
33+
private static final Supplier<Random> randomSupplier = ThreadLocalRandom::current;
34+
35+
/**
36+
* Base Constructor.
37+
* @param spanName span name
38+
* @param parentSpan parent span
39+
* @param spanProcessor span processor
40+
*/
41+
public MockSpan(String spanName, Span parentSpan, SpanProcessor spanProcessor) {
42+
this(
43+
spanName,
44+
parentSpan,
45+
parentSpan != null ? parentSpan.getTraceId() : IdGenerator.generateTraceId(),
46+
IdGenerator.generateSpanId(),
47+
spanProcessor
48+
);
49+
}
50+
51+
/**
52+
* Constructor with traceId and SpanIds
53+
* @param spanName Span Name
54+
* @param parentSpan Parent Span
55+
* @param traceId Trace ID
56+
* @param spanId Span ID
57+
* @param spanProcessor Span Processor
58+
*/
59+
public MockSpan(String spanName, Span parentSpan, String traceId, String spanId, SpanProcessor spanProcessor) {
60+
super(spanName, parentSpan);
61+
this.spanProcessor = spanProcessor;
62+
this.metadata = new HashMap<>();
63+
this.traceId = traceId;
64+
this.spanId = spanId;
65+
this.startTime = System.nanoTime();
66+
}
67+
68+
@Override
69+
public void endSpan() {
70+
synchronized (lock) {
71+
if (hasEnded) {
72+
return;
73+
}
74+
endTime = System.nanoTime();
75+
hasEnded = true;
76+
}
77+
spanProcessor.onEnd(this);
78+
}
79+
80+
@Override
81+
public void addAttribute(String key, String value) {
82+
putMetadata(key, value);
83+
}
84+
85+
@Override
86+
public void addAttribute(String key, Long value) {
87+
putMetadata(key, value);
88+
}
89+
90+
@Override
91+
public void addAttribute(String key, Double value) {
92+
putMetadata(key, value);
93+
}
94+
95+
@Override
96+
public void addAttribute(String key, Boolean value) {
97+
putMetadata(key, value);
98+
}
99+
100+
@Override
101+
public void addEvent(String event) {
102+
putMetadata(event, null);
103+
}
104+
105+
private void putMetadata(String key, Object value) {
106+
metadata.put(key, value);
107+
}
108+
109+
@Override
110+
public String getTraceId() {
111+
return traceId;
112+
}
113+
114+
@Override
115+
public String getSpanId() {
116+
return spanId;
117+
}
118+
119+
/**
120+
* Returns whether the span is ended or not.
121+
* @return span end status.
122+
*/
123+
public boolean hasEnded() {
124+
synchronized (lock) {
125+
return hasEnded;
126+
}
127+
}
128+
129+
/**
130+
* Returns the start time of the span.
131+
* @return start time of the span.
132+
*/
133+
public Long getStartTime() {
134+
return startTime;
135+
}
136+
137+
/**
138+
* Returns the start time of the span.
139+
* @return end time of the span.
140+
*/
141+
public Long getEndTime() {
142+
return endTime;
143+
}
144+
145+
private static class IdGenerator {
146+
private static String generateSpanId() {
147+
long id = randomSupplier.get().nextLong();
148+
return Long.toHexString(id);
149+
}
150+
151+
private static String generateTraceId() {
152+
long idHi = randomSupplier.get().nextLong();
153+
long idLo = randomSupplier.get().nextLong();
154+
long result = idLo | (idHi << 32);
155+
return Long.toHexString(result);
156+
}
157+
158+
}
159+
}

0 commit comments

Comments
 (0)