Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add peer service support back to couchbase26 #5451

Merged
merged 6 commits into from
Feb 28, 2022
Merged
Show file tree
Hide file tree
Changes from 4 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
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,6 @@ dependencies {
testImplementation("org.spockframework:spock-core")

testImplementation(project(":instrumentation-api"))
testImplementation(project(":instrumentation:couchbase:couchbase-2.0:javaagent"))
testImplementation(project(":instrumentation:couchbase:couchbase-2.0-common:javaagent"))
testImplementation("com.couchbase.client:java-client:2.5.0")
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
plugins {
id("otel.javaagent-instrumentation")
}

dependencies {
compileOnly("com.google.auto.value:auto-value-annotations")
annotationProcessor("com.google.auto.value:auto-value")
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
import javax.annotation.Nullable;

@AutoValue
public abstract class CouchbaseRequest {
public abstract class CouchbaseRequestInfo {

private static final ClassValue<Map<String, String>> methodOperationNames =
new ClassValue<Map<String, String>>() {
Expand All @@ -22,19 +22,24 @@ protected Map<String, String> computeValue(Class<?> type) {
}
};

public static CouchbaseRequest create(
private String peerName;
private Integer peerPort;
private String localAddress;
private String operationId;

public static CouchbaseRequestInfo create(
@Nullable String bucket, Class<?> declaringClass, String methodName) {
String operation =
methodOperationNames
.get(declaringClass)
.computeIfAbsent(methodName, m -> computeOperation(declaringClass, m));
return new AutoValue_CouchbaseRequest(bucket, null, operation, true);
return new AutoValue_CouchbaseRequestInfo(bucket, null, operation, true);
}

public static CouchbaseRequest create(@Nullable String bucket, Object query) {
public static CouchbaseRequestInfo create(@Nullable String bucket, Object query) {
SqlStatementInfo statement = CouchbaseQuerySanitizer.sanitize(query);

return new AutoValue_CouchbaseRequest(
return new AutoValue_CouchbaseRequestInfo(
bucket, statement.getFullStatement(), statement.getOperation(), false);
}

Expand All @@ -54,4 +59,40 @@ private static String computeOperation(Class<?> declaringClass, String methodNam
public abstract String operation();

public abstract boolean isMethodCall();

@Nullable
public String getPeerName() {
return peerName;
}

public void setPeerName(String peerName) {
this.peerName = peerName;
}

@Nullable
public Integer getPeerPort() {
return peerPort;
}

public void setPeerPort(Integer peerPort) {
this.peerPort = peerPort;
}

@Nullable
public String getLocalAddress() {
return localAddress;
}

public void setLocalAddress(String localAddress) {
this.localAddress = localAddress;
}

@Nullable
public String getOperationId() {
return operationId;
}

public void setOperationId(String operationId) {
this.operationId = operationId;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
/*
* Copyright The OpenTelemetry Authors
* SPDX-License-Identifier: Apache-2.0
*/

package io.opentelemetry.javaagent.instrumentation.couchbase.v2_0;

import static io.opentelemetry.context.ContextKey.named;

import io.opentelemetry.context.Context;
import io.opentelemetry.context.ContextKey;
import io.opentelemetry.context.ImplicitContextKeyed;
import javax.annotation.Nullable;

public final class CouchbaseRequestInfoHolder implements ImplicitContextKeyed {

private static final ContextKey<CouchbaseRequestInfoHolder> KEY =
named("opentelemetry-couchbase-request-key");

private final CouchbaseRequestInfo couchbaseRequest;
laurit marked this conversation as resolved.
Show resolved Hide resolved

private CouchbaseRequestInfoHolder(CouchbaseRequestInfo couchbaseRequest) {
this.couchbaseRequest = couchbaseRequest;
}

public static Context init(Context context, CouchbaseRequestInfo couchbaseRequest) {
if (context.get(KEY) != null) {
return context;
}
return context.with(new CouchbaseRequestInfoHolder(couchbaseRequest));
}

@Nullable
public static CouchbaseRequestInfo get(Context context) {
CouchbaseRequestInfoHolder holder = context.get(KEY);
if (holder != null) {
return holder.couchbaseRequest;
}
return null;
}

@Override
public Context storeInContext(Context context) {
return context.with(KEY, this);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -28,9 +28,7 @@ muzzle {
}

dependencies {
compileOnly("com.google.auto.value:auto-value-annotations")
annotationProcessor("com.google.auto.value:auto-value")

implementation(project(":instrumentation:couchbase:couchbase-2.0-common:javaagent"))
implementation(project(":instrumentation:rxjava:rxjava-1.0:library"))

library("com.couchbase.client:java-client:2.0.0")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,39 +9,39 @@
import io.opentelemetry.semconv.trace.attributes.SemanticAttributes;
import javax.annotation.Nullable;

final class CouchbaseAttributesExtractor extends DbAttributesExtractor<CouchbaseRequest, Void> {
final class CouchbaseAttributesExtractor extends DbAttributesExtractor<CouchbaseRequestInfo, Void> {
@Override
protected String system(CouchbaseRequest couchbaseRequest) {
protected String system(CouchbaseRequestInfo couchbaseRequest) {
return SemanticAttributes.DbSystemValues.COUCHBASE;
}

@Override
@Nullable
protected String user(CouchbaseRequest couchbaseRequest) {
protected String user(CouchbaseRequestInfo couchbaseRequest) {
return null;
}

@Override
@Nullable
protected String name(CouchbaseRequest couchbaseRequest) {
protected String name(CouchbaseRequestInfo couchbaseRequest) {
return couchbaseRequest.bucket();
}

@Override
@Nullable
protected String connectionString(CouchbaseRequest couchbaseRequest) {
protected String connectionString(CouchbaseRequestInfo couchbaseRequest) {
return null;
}

@Override
@Nullable
protected String statement(CouchbaseRequest couchbaseRequest) {
protected String statement(CouchbaseRequestInfo couchbaseRequest) {
return couchbaseRequest.statement();
}

@Override
@Nullable
protected String operation(CouchbaseRequest couchbaseRequest) {
protected String operation(CouchbaseRequestInfo couchbaseRequest) {
return couchbaseRequest.operation();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,8 @@ public static void subscribeResult(
if (callDepth.decrementAndGet() > 0) {
return;
}
CouchbaseRequest request = CouchbaseRequest.create(bucket, declaringClass, methodName);
CouchbaseRequestInfo request =
CouchbaseRequestInfo.create(bucket, declaringClass, methodName);
result = Observable.create(new TracedOnSubscribe<>(result, instrumenter(), request));
}
}
Expand All @@ -87,10 +88,10 @@ public static void subscribeResult(
return;
}

CouchbaseRequest request =
CouchbaseRequestInfo request =
query == null
? CouchbaseRequest.create(bucket, declaringClass, methodName)
: CouchbaseRequest.create(bucket, query);
? CouchbaseRequestInfo.create(bucket, declaringClass, methodName)
: CouchbaseRequestInfo.create(bucket, query);
result = Observable.create(new TracedOnSubscribe<>(result, instrumenter(), request));
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ public static void subscribeResult(
return;
}

CouchbaseRequest request = CouchbaseRequest.create(null, declaringClass, methodName);
CouchbaseRequestInfo request = CouchbaseRequestInfo.create(null, declaringClass, methodName);
result = Observable.create(new TracedOnSubscribe<>(result, instrumenter(), request));
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
/*
* Copyright The OpenTelemetry Authors
* SPDX-License-Identifier: Apache-2.0
*/

package io.opentelemetry.javaagent.instrumentation.couchbase.v2_0;

import io.opentelemetry.instrumentation.api.instrumenter.net.NetClientAttributesGetter;
import io.opentelemetry.semconv.trace.attributes.SemanticAttributes;
import javax.annotation.Nullable;

public class CouchbaseNetAttributesGetter
implements NetClientAttributesGetter<CouchbaseRequestInfo, Void> {
@Nullable
@Override
public String transport(CouchbaseRequestInfo couchbaseRequest, @Nullable Void unused) {
return couchbaseRequest.getPeerName() != null
? SemanticAttributes.NetTransportValues.IP_TCP
: null;
}

@Nullable
@Override
public String peerName(CouchbaseRequestInfo couchbaseRequest, @Nullable Void unused) {
return couchbaseRequest.getPeerName();
}

@Nullable
@Override
public Integer peerPort(CouchbaseRequestInfo couchbaseRequest, @Nullable Void unused) {
return couchbaseRequest.getPeerPort();
}

@Nullable
@Override
public String peerIp(CouchbaseRequestInfo couchbaseRequest, @Nullable Void unused) {
return null;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,30 +6,48 @@
package io.opentelemetry.javaagent.instrumentation.couchbase.v2_0;

import io.opentelemetry.api.GlobalOpenTelemetry;
import io.opentelemetry.instrumentation.api.config.Config;
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
import io.opentelemetry.instrumentation.api.instrumenter.InstrumenterBuilder;
import io.opentelemetry.instrumentation.api.instrumenter.PeerServiceAttributesExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.SpanKindExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.SpanNameExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.db.DbSpanNameExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.net.NetClientAttributesExtractor;

public final class CouchbaseSingletons {

private static final String INSTRUMENTATION_NAME = "io.opentelemetry.couchbase-2.0";

private static final Instrumenter<CouchbaseRequest, Void> INSTRUMENTER;
private static final Instrumenter<CouchbaseRequestInfo, Void> INSTRUMENTER;

static {
CouchbaseAttributesExtractor couchbaseAttributesExtractor = new CouchbaseAttributesExtractor();
SpanNameExtractor<CouchbaseRequest> spanNameExtractor =
SpanNameExtractor<CouchbaseRequestInfo> spanNameExtractor =
new CouchbaseSpanNameExtractor(DbSpanNameExtractor.create(couchbaseAttributesExtractor));
CouchbaseNetAttributesGetter netAttributesGetter = new CouchbaseNetAttributesGetter();
NetClientAttributesExtractor<CouchbaseRequestInfo, Void> netClientAttributesExtractor =
NetClientAttributesExtractor.create(netAttributesGetter);

INSTRUMENTER =
Instrumenter.<CouchbaseRequest, Void>builder(
InstrumenterBuilder<CouchbaseRequestInfo, Void> builder =
Instrumenter.<CouchbaseRequestInfo, Void>builder(
GlobalOpenTelemetry.get(), INSTRUMENTATION_NAME, spanNameExtractor)
.addAttributesExtractor(couchbaseAttributesExtractor)
.newInstrumenter(SpanKindExtractor.alwaysClient());
.addAttributesExtractor(netClientAttributesExtractor)
.addAttributesExtractor(PeerServiceAttributesExtractor.create(netAttributesGetter))
.addContextCustomizer(
(context, couchbaseRequest, startAttributes) ->
CouchbaseRequestInfoHolder.init(context, couchbaseRequest));

if (Config.get()
.getBoolean("otel.instrumentation.couchbase.experimental-span-attributes", false)) {
builder.addAttributesExtractor(new ExperimentalAttributesExtractor());
}

INSTRUMENTER = builder.newInstrumenter(SpanKindExtractor.alwaysClient());
}

public static Instrumenter<CouchbaseRequest, Void> instrumenter() {
public static Instrumenter<CouchbaseRequestInfo, Void> instrumenter() {
return INSTRUMENTER;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,15 @@

import io.opentelemetry.instrumentation.api.instrumenter.SpanNameExtractor;

public class CouchbaseSpanNameExtractor implements SpanNameExtractor<CouchbaseRequest> {
private final SpanNameExtractor<CouchbaseRequest> dbSpanNameExtractor;
public class CouchbaseSpanNameExtractor implements SpanNameExtractor<CouchbaseRequestInfo> {
private final SpanNameExtractor<CouchbaseRequestInfo> dbSpanNameExtractor;

public CouchbaseSpanNameExtractor(SpanNameExtractor<CouchbaseRequest> dbSpanNameExtractor) {
public CouchbaseSpanNameExtractor(SpanNameExtractor<CouchbaseRequestInfo> dbSpanNameExtractor) {
this.dbSpanNameExtractor = dbSpanNameExtractor;
}

@Override
public String extract(CouchbaseRequest couchbaseRequest) {
public String extract(CouchbaseRequestInfo couchbaseRequest) {
if (couchbaseRequest.isMethodCall()) {
return couchbaseRequest.operation();
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
/*
* Copyright The OpenTelemetry Authors
* SPDX-License-Identifier: Apache-2.0
*/

package io.opentelemetry.javaagent.instrumentation.couchbase.v2_0;

import io.opentelemetry.api.common.AttributesBuilder;
import io.opentelemetry.context.Context;
import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor;
import javax.annotation.Nullable;

public class ExperimentalAttributesExtractor
implements AttributesExtractor<CouchbaseRequestInfo, Void> {

@Override
public void onStart(
AttributesBuilder attributes, Context parentContext, CouchbaseRequestInfo request) {}

@Override
public void onEnd(
AttributesBuilder attributes,
Context context,
CouchbaseRequestInfo request,
@Nullable Void response,
@Nullable Throwable error) {
attributes.put("couchbase.operation_id", request.getOperationId());
attributes.put("couchbase.local.address", request.getLocalAddress());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ muzzle {

dependencies {
implementation(project(":instrumentation:rxjava:rxjava-1.0:library"))
implementation(project(":instrumentation:couchbase:couchbase-2.0-common:javaagent"))

library("com.couchbase.client:java-client:2.6.0")

Expand Down
Loading