in instrumentation/openai-client-instrumentation/instrumentation-1.1/src/main/java/co/elastic/otel/openai/v1_1/wrappers/GenAiClientMetrics.java [94:129]
public void onEnd(Context context, Attributes endAttributes, long endNanos) {
State state = context.get(GEN_AI_CLIENT_METRICS_STATE);
if (state == null) {
return;
}
AttributesBuilder commonBuilder = Attributes.builder();
copyAttribute(state.startAttributes, commonBuilder, SERVER_PORT);
copyAttribute(state.startAttributes, commonBuilder, SERVER_ADDRESS);
copyAttribute(state.startAttributes, commonBuilder, GEN_AI_OPERATION_NAME);
copyAttribute(state.startAttributes, commonBuilder, GEN_AI_SYSTEM);
copyAttribute(state.startAttributes, commonBuilder, GEN_AI_REQUEST_MODEL);
copyAttribute(endAttributes, commonBuilder, GEN_AI_RESPONSE_MODEL);
Attributes common = commonBuilder.build();
AttributesBuilder durationAttributesBuilder = common.toBuilder();
copyAttribute(endAttributes, durationAttributesBuilder, ERROR_TYPE);
clientOperationDuration.record(
(endNanos - state.startTimeNanos) / NANOS_PER_S,
durationAttributesBuilder.build(),
context);
Long inputTokens = endAttributes.get(GEN_AI_USAGE_INPUT_TOKENS);
if (inputTokens != null) {
clientTokenUsage.record(
inputTokens,
common.toBuilder().put(GEN_AI_TOKEN_TYPE, TOKEN_TYPE_INPUT).build(),
context);
}
Long outputTokens = endAttributes.get(GEN_AI_USAGE_OUTPUT_TOKENS);
if (outputTokens != null) {
clientTokenUsage.record(
outputTokens,
common.toBuilder().put(GEN_AI_TOKEN_TYPE, TOKEN_TYPE_OUTPUT).build(),
context);
}
}