Skip to content
Open
Show file tree
Hide file tree
Changes from all 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
205 changes: 205 additions & 0 deletions docs/instrumentation-list.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -7618,6 +7618,211 @@ libraries:
target_versions:
javaagent:
- io.vertx:vertx-kafka-client:[3.5.1,)
- name: vertx-redis-client-3.7
source_path: instrumentation/vertx/vertx-redis-client-3.7
scope:
name: io.opentelemetry.vertx-redis-client-3.7
target_versions:
javaagent:
- io.vertx:vertx-redis-client:[3.7.0,3.8.0)
telemetry:
- when: default
spans:
- span_kind: CLIENT
attributes:
- name: db.operation
type: STRING
- name: db.redis.database_index
type: LONG
- name: db.statement
type: STRING
- name: db.system
type: STRING
- name: network.peer.address
type: STRING
- name: network.peer.port
type: LONG
- name: server.address
type: STRING
- name: server.port
type: LONG
- when: otel.semconv-stability.opt-in=database
metrics:
- name: db.client.operation.duration
description: Duration of database client operations.
type: HISTOGRAM
unit: s
attributes:
- name: db.namespace
type: STRING
- name: db.operation.name
type: STRING
- name: db.system.name
type: STRING
- name: network.peer.address
type: STRING
- name: network.peer.port
type: LONG
- name: server.address
type: STRING
- name: server.port
type: LONG
spans:
- span_kind: CLIENT
attributes:
- name: db.namespace
type: STRING
- name: db.operation.name
type: STRING
- name: db.query.text
type: STRING
- name: db.system.name
type: STRING
- name: network.peer.address
type: STRING
- name: network.peer.port
type: LONG
- name: server.address
type: STRING
- name: server.port
type: LONG
- name: vertx-redis-client-3.8
source_path: instrumentation/vertx/vertx-redis-client-3.8
scope:
name: io.opentelemetry.vertx-redis-client-3.8
target_versions:
javaagent:
- io.vertx:vertx-redis-client:[3.8.0,3.9.0)
telemetry:
- when: default
spans:
- span_kind: CLIENT
attributes:
- name: db.operation
type: STRING
- name: db.redis.database_index
type: LONG
- name: db.statement
type: STRING
- name: db.system
type: STRING
- name: network.peer.address
type: STRING
- name: network.peer.port
type: LONG
- name: server.address
type: STRING
- name: server.port
type: LONG
- when: otel.semconv-stability.opt-in=database
metrics:
- name: db.client.operation.duration
description: Duration of database client operations.
type: HISTOGRAM
unit: s
attributes:
- name: db.namespace
type: STRING
- name: db.operation.name
type: STRING
- name: db.system.name
type: STRING
- name: network.peer.address
type: STRING
- name: network.peer.port
type: LONG
- name: server.address
type: STRING
- name: server.port
type: LONG
spans:
- span_kind: CLIENT
attributes:
- name: db.namespace
type: STRING
- name: db.operation.name
type: STRING
- name: db.query.text
type: STRING
- name: db.system.name
type: STRING
- name: network.peer.address
type: STRING
- name: network.peer.port
type: LONG
- name: server.address
type: STRING
- name: server.port
type: LONG
- name: vertx-redis-client-3.9
description: This instrumentation enables Redis client spans for Vert.x Redis client 3.9.x versions, supporting both standalone and cluster modes.
source_path: instrumentation/vertx/vertx-redis-client-3.9
scope:
name: io.opentelemetry.vertx-redis-client-3.9
target_versions:
javaagent:
- io.vertx:vertx-redis-client:[3.9.1,4.0.0)
telemetry:
- when: default
spans:
- span_kind: CLIENT
attributes:
- name: db.operation
type: STRING
- name: db.redis.database_index
type: LONG
- name: db.statement
type: STRING
- name: db.system
type: STRING
- name: network.peer.address
type: STRING
- name: network.peer.port
type: LONG
- name: server.address
type: STRING
- name: server.port
type: LONG
- when: otel.semconv-stability.opt-in=database
metrics:
- name: db.client.operation.duration
description: Duration of database client operations.
type: HISTOGRAM
unit: s
attributes:
- name: db.namespace
type: STRING
- name: db.operation.name
type: STRING
- name: db.system.name
type: STRING
- name: network.peer.address
type: STRING
- name: network.peer.port
type: LONG
- name: server.address
type: STRING
- name: server.port
type: LONG
spans:
- span_kind: CLIENT
attributes:
- name: db.namespace
type: STRING
- name: db.operation.name
type: STRING
- name: db.query.text
type: STRING
- name: db.system.name
type: STRING
- name: network.peer.address
type: STRING
- name: network.peer.port
type: LONG
- name: server.address
type: STRING
- name: server.port
type: LONG
- name: vertx-redis-client-4.0
source_path: instrumentation/vertx/vertx-redis-client-4.0
scope:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,9 @@ dependencies {

compileOnly("com.google.auto.value:auto-value-annotations")
annotationProcessor("com.google.auto.value:auto-value")
// Add Vertx dependency for context storage
compileOnly("io.vertx:vertx-core:4.0.0")
compileOnly("io.vertx:vertx-codegen:4.0.0")

testLibrary("com.datastax.cassandra:cassandra-driver-core:3.2.0")
testInstrumentation(project(":instrumentation:guava-10.0:javaagent"))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
import io.opentelemetry.context.Context;
import io.opentelemetry.context.Scope;
import java.util.Map;
import io.vertx.core.Vertx;

public class TracingSession implements Session {

Expand Down Expand Up @@ -49,7 +50,12 @@ public ListenableFuture<Session> initAsync() {
@Override
public ResultSet execute(String query) {
CassandraRequest request = CassandraRequest.create(session, query);
Context context = instrumenter().start(Context.current(), request);
Context parentContext=Context.current();;
io.vertx.core.Context storedContext = Vertx.currentContext();
if((parentContext==null||parentContext==Context.root())&&storedContext!=null&&storedContext.get("otel.context")!=null&&storedContext.get("otel.context")!=Context.root()){
parentContext=storedContext.get("otel.context");
}
Context context = instrumenter().start(parentContext, request);
ResultSet resultSet;
try (Scope ignored = context.makeCurrent()) {
resultSet = session.execute(query);
Expand All @@ -64,7 +70,12 @@ public ResultSet execute(String query) {
@Override
public ResultSet execute(String query, Object... values) {
CassandraRequest request = CassandraRequest.create(session, query);
Context context = instrumenter().start(Context.current(), request);
Context parentContext=Context.current();;
io.vertx.core.Context storedContext = Vertx.currentContext();
if((parentContext==null||parentContext==Context.root())&&storedContext!=null&&storedContext.get("otel.context")!=null&&storedContext.get("otel.context")!=Context.root()){
parentContext=storedContext.get("otel.context");
}
Context context = instrumenter().start(parentContext, request);
ResultSet resultSet;
try (Scope ignored = context.makeCurrent()) {
resultSet = session.execute(query, values);
Expand All @@ -79,7 +90,12 @@ public ResultSet execute(String query, Object... values) {
@Override
public ResultSet execute(String query, Map<String, Object> values) {
CassandraRequest request = CassandraRequest.create(session, query);
Context context = instrumenter().start(Context.current(), request);
Context parentContext=Context.current();;
io.vertx.core.Context storedContext = Vertx.currentContext();
if((parentContext==null||parentContext==Context.root())&&storedContext!=null&&storedContext.get("otel.context")!=null&&storedContext.get("otel.context")!=Context.root()){
parentContext=storedContext.get("otel.context");
}
Context context = instrumenter().start(parentContext, request);
ResultSet resultSet;
try (Scope ignored = context.makeCurrent()) {
resultSet = session.execute(query, values);
Expand All @@ -95,7 +111,12 @@ public ResultSet execute(String query, Map<String, Object> values) {
public ResultSet execute(Statement statement) {
String query = getQuery(statement);
CassandraRequest request = CassandraRequest.create(session, query);
Context context = instrumenter().start(Context.current(), request);
Context parentContext=Context.current();;
io.vertx.core.Context storedContext = Vertx.currentContext();
if((parentContext==null||parentContext==Context.root())&&storedContext!=null&&storedContext.get("otel.context")!=null&&storedContext.get("otel.context")!=Context.root()){
parentContext=storedContext.get("otel.context");
}
Context context = instrumenter().start(parentContext, request);
ResultSet resultSet;
try (Scope ignored = context.makeCurrent()) {
resultSet = session.execute(statement);
Expand All @@ -110,7 +131,12 @@ public ResultSet execute(Statement statement) {
@Override
public ResultSetFuture executeAsync(String query) {
CassandraRequest request = CassandraRequest.create(session, query);
Context context = instrumenter().start(Context.current(), request);
Context parentContext=Context.current();;
io.vertx.core.Context storedContext = Vertx.currentContext();
if((parentContext==null||parentContext==Context.root())&&storedContext!=null&&storedContext.get("otel.context")!=null&&storedContext.get("otel.context")!=Context.root()){
parentContext=storedContext.get("otel.context");
}
Context context = instrumenter().start(parentContext, request);
try (Scope ignored = context.makeCurrent()) {
ResultSetFuture future = session.executeAsync(query);
addCallbackToEndSpan(future, context, request);
Expand All @@ -121,7 +147,12 @@ public ResultSetFuture executeAsync(String query) {
@Override
public ResultSetFuture executeAsync(String query, Object... values) {
CassandraRequest request = CassandraRequest.create(session, query);
Context context = instrumenter().start(Context.current(), request);
Context parentContext=Context.current();;
io.vertx.core.Context storedContext = Vertx.currentContext();
if((parentContext==null||parentContext==Context.root())&&storedContext!=null&&storedContext.get("otel.context")!=null&&storedContext.get("otel.context")!=Context.root()){
parentContext=storedContext.get("otel.context");
}
Context context = instrumenter().start(parentContext, request);
try (Scope ignored = context.makeCurrent()) {
ResultSetFuture future = session.executeAsync(query, values);
addCallbackToEndSpan(future, context, request);
Expand All @@ -132,7 +163,12 @@ public ResultSetFuture executeAsync(String query, Object... values) {
@Override
public ResultSetFuture executeAsync(String query, Map<String, Object> values) {
CassandraRequest request = CassandraRequest.create(session, query);
Context context = instrumenter().start(Context.current(), request);
Context parentContext=Context.current();;
io.vertx.core.Context storedContext = Vertx.currentContext();
if((parentContext==null||parentContext==Context.root())&&storedContext!=null&&storedContext.get("otel.context")!=null&&storedContext.get("otel.context")!=Context.root()){
parentContext=storedContext.get("otel.context");
}
Context context = instrumenter().start(parentContext, request);
try (Scope ignored = context.makeCurrent()) {
ResultSetFuture future = session.executeAsync(query, values);
addCallbackToEndSpan(future, context, request);
Expand All @@ -144,7 +180,12 @@ public ResultSetFuture executeAsync(String query, Map<String, Object> values) {
public ResultSetFuture executeAsync(Statement statement) {
String query = getQuery(statement);
CassandraRequest request = CassandraRequest.create(session, query);
Context context = instrumenter().start(Context.current(), request);
Context parentContext=Context.current();;
io.vertx.core.Context storedContext = Vertx.currentContext();
if((parentContext==null||parentContext==Context.root())&&storedContext!=null&&storedContext.get("otel.context")!=null&&storedContext.get("otel.context")!=Context.root()){
parentContext=storedContext.get("otel.context");
}
Context context = instrumenter().start(parentContext, request);
try (Scope ignored = context.makeCurrent()) {
ResultSetFuture future = session.executeAsync(statement);
addCallbackToEndSpan(future, context, request);
Expand Down
4 changes: 4 additions & 0 deletions instrumentation/netty/netty-4.1/library/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,10 @@ dependencies {
implementation(project(":instrumentation:netty:netty-common-4.0:library"))
implementation(project(":instrumentation:netty:netty-common:library"))

// Add Vertx dependency for context storage
compileOnly("io.vertx:vertx-core:4.0.0")
compileOnly("io.vertx:vertx-codegen:4.0.0")

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

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
import io.opentelemetry.instrumentation.netty.common.v4_0.HttpRequestAndChannel;
import io.opentelemetry.instrumentation.netty.v4_1.internal.AttributeKeys;
import io.vertx.core.Vertx;

/**
* This class is internal and is hence not for public use. Its APIs are unstable and can change at
Expand All @@ -42,10 +43,19 @@ public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise prm) thr
}

Context parentContext = ctx.channel().attr(AttributeKeys.CLIENT_PARENT_CONTEXT).get();
if (parentContext == null) {
if (parentContext == null||parentContext==Context.root()) {
parentContext = Context.current();
}

if (parentContext == null||parentContext==Context.root()) {
io.vertx.core.Context vertxContext = Vertx.currentContext();
if (vertxContext != null) {
Context storedOtelContext =
vertxContext.get("otel.context");
if (storedOtelContext != null && storedOtelContext!=Context.root()) {
parentContext = storedOtelContext;
}
}
}
HttpRequestAndChannel request = HttpRequestAndChannel.create((HttpRequest) msg, ctx.channel());
if (!instrumenter.shouldStart(parentContext, request) || isAwsRequest(request)) {
super.write(ctx, msg, prm);
Expand Down
Loading
Loading