public void onEnd()

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);
    }
  }