TelemetryConfig.java

/*---------------------------------------------------------------------------------------------
 *  Copyright (c) Microsoft Corporation. All rights reserved.
 *--------------------------------------------------------------------------------------------*/

package com.github.copilot.sdk.json;

/**
 * OpenTelemetry configuration for the Copilot CLI server.
 * <p>
 * When set on {@link CopilotClientOptions#setTelemetry(TelemetryConfig)}, the
 * CLI server is started with OpenTelemetry instrumentation enabled using the
 * provided settings.
 *
 * <h2>Example Usage</h2>
 *
 * <pre>{@code
 * var options = new CopilotClientOptions()
 * 		.setTelemetry(new TelemetryConfig().setOtlpEndpoint("http://localhost:4318").setSourceName("my-app"));
 * }</pre>
 *
 * @see CopilotClientOptions#setTelemetry(TelemetryConfig)
 * @since 1.2.0
 */
public class TelemetryConfig {

    private String otlpEndpoint;
    private String filePath;
    private String exporterType;
    private String sourceName;
    private Boolean captureContent;

    /**
     * Gets the OTLP exporter endpoint URL.
     * <p>
     * Maps to the {@code OTEL_EXPORTER_OTLP_ENDPOINT} environment variable.
     *
     * @return the OTLP endpoint URL, or {@code null}
     */
    public String getOtlpEndpoint() {
        return otlpEndpoint;
    }

    /**
     * Sets the OTLP exporter endpoint URL.
     *
     * @param otlpEndpoint
     *            the endpoint URL (e.g., {@code "http://localhost:4318"})
     * @return this config for method chaining
     */
    public TelemetryConfig setOtlpEndpoint(String otlpEndpoint) {
        this.otlpEndpoint = otlpEndpoint;
        return this;
    }

    /**
     * Gets the file path for the file exporter.
     * <p>
     * Maps to the {@code COPILOT_OTEL_FILE_EXPORTER_PATH} environment variable.
     *
     * @return the file path, or {@code null}
     */
    public String getFilePath() {
        return filePath;
    }

    /**
     * Sets the file path for the file exporter.
     *
     * @param filePath
     *            the path where telemetry spans are written
     * @return this config for method chaining
     */
    public TelemetryConfig setFilePath(String filePath) {
        this.filePath = filePath;
        return this;
    }

    /**
     * Gets the exporter type.
     * <p>
     * Maps to the {@code COPILOT_OTEL_EXPORTER_TYPE} environment variable.
     *
     * @return the exporter type (e.g., {@code "otlp-http"} or {@code "file"}), or
     *         {@code null}
     */
    public String getExporterType() {
        return exporterType;
    }

    /**
     * Sets the exporter type.
     *
     * @param exporterType
     *            the exporter type ({@code "otlp-http"} or {@code "file"})
     * @return this config for method chaining
     */
    public TelemetryConfig setExporterType(String exporterType) {
        this.exporterType = exporterType;
        return this;
    }

    /**
     * Gets the source name for telemetry spans.
     * <p>
     * Maps to the {@code COPILOT_OTEL_SOURCE_NAME} environment variable.
     *
     * @return the source name, or {@code null}
     */
    public String getSourceName() {
        return sourceName;
    }

    /**
     * Sets the source name for telemetry spans.
     *
     * @param sourceName
     *            a name identifying the application producing the spans
     * @return this config for method chaining
     */
    public TelemetryConfig setSourceName(String sourceName) {
        this.sourceName = sourceName;
        return this;
    }

    /**
     * Gets whether to capture message content as part of telemetry.
     * <p>
     * Maps to the {@code OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT}
     * environment variable.
     *
     * @return {@code true} to capture content, {@code false} to suppress it, or
     *         {@code null} to use the default
     */
    public Boolean getCaptureContent() {
        return captureContent;
    }

    /**
     * Sets whether to capture message content as part of telemetry.
     *
     * @param captureContent
     *            {@code true} to capture content, {@code false} to suppress it
     * @return this config for method chaining
     */
    public TelemetryConfig setCaptureContent(Boolean captureContent) {
        this.captureContent = captureContent;
        return this;
    }
}