diff --git a/exporters/otlp/profiles/build.gradle.kts b/exporters/otlp/profiles/build.gradle.kts new file mode 100644 index 00000000000..8b22581662f --- /dev/null +++ b/exporters/otlp/profiles/build.gradle.kts @@ -0,0 +1,13 @@ +plugins { + id("otel.java-conventions") + id("otel.publish-conventions") + + id("otel.animalsniffer-conventions") +} + +description = "OpenTelemetry - Profiles Exporter" +otelJava.moduleName.set("io.opentelemetry.exporter.otlp.profiles") + +dependencies { + api(project(":sdk:common")) +} diff --git a/exporters/otlp/profiles/gradle.properties b/exporters/otlp/profiles/gradle.properties new file mode 100644 index 00000000000..4476ae57e31 --- /dev/null +++ b/exporters/otlp/profiles/gradle.properties @@ -0,0 +1 @@ +otel.release=alpha diff --git a/exporters/otlp/profiles/src/main/java/io/opentelemetry/exporter/otlp/profiles/AggregationTemporality.java b/exporters/otlp/profiles/src/main/java/io/opentelemetry/exporter/otlp/profiles/AggregationTemporality.java new file mode 100644 index 00000000000..4586a4652b1 --- /dev/null +++ b/exporters/otlp/profiles/src/main/java/io/opentelemetry/exporter/otlp/profiles/AggregationTemporality.java @@ -0,0 +1,39 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.exporter.otlp.profiles; + +/** + * Specifies the method of aggregating metric values. + * + *
TODO: This is intentionally not the same as metrics/AggregationTemporality. For profiles.proto + * 'v1experimental' version, this class is considered distinct from the pre-exiting + * AggregationTemporality in metrics.proto. As the profiles.proto stabilises, they may be refactored + * into a version in common.proto. Meanwhile the Java class structure reflects the .proto structure + * in making distinct entities. + * + *
refs for refactoring discussion:
+ *
+ * @see
+ * "https://github.com/open-telemetry/opentelemetry-proto/blob/v1.3.0/opentelemetry/proto/metrics/v1/metrics.proto#L261"
+ * @see
+ * "https://github.com/open-telemetry/opentelemetry-proto/blob/v1.3.0/opentelemetry/proto/profiles/v1experimental/pprofextended.proto#L147"
+ * @see "https://github.com/open-telemetry/opentelemetry-proto/issues/547"
+ * @see "https://github.com/open-telemetry/opentelemetry-proto/pull/534#discussion_r1552403726"
+ * @see "profiles.proto::AggregationTemporality"
+ */
+public enum AggregationTemporality {
+
+ /**
+ * DELTA is an AggregationTemporality for a profiler which reports changes since last report time.
+ */
+ DELTA,
+
+ /**
+ * CUMULATIVE is an AggregationTemporality for a profiler which reports changes since a fixed
+ * start time.
+ */
+ CUMULATIVE
+}
diff --git a/exporters/otlp/profiles/src/main/java/io/opentelemetry/exporter/otlp/profiles/AttributeUnitData.java b/exporters/otlp/profiles/src/main/java/io/opentelemetry/exporter/otlp/profiles/AttributeUnitData.java
new file mode 100644
index 00000000000..47f2403cbd4
--- /dev/null
+++ b/exporters/otlp/profiles/src/main/java/io/opentelemetry/exporter/otlp/profiles/AttributeUnitData.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright The OpenTelemetry Authors
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+package io.opentelemetry.exporter.otlp.profiles;
+
+import javax.annotation.concurrent.Immutable;
+
+/**
+ * Represents a mapping between Attribute Keys and Units.
+ *
+ * @see "pprofextended.proto::AttributeUnit"
+ */
+@Immutable
+public interface AttributeUnitData {
+
+ /** Index into string table. */
+ long getAttributeKey();
+
+ /** Index into string table. */
+ long getUnitIndex();
+}
diff --git a/exporters/otlp/profiles/src/main/java/io/opentelemetry/exporter/otlp/profiles/BuildIdKind.java b/exporters/otlp/profiles/src/main/java/io/opentelemetry/exporter/otlp/profiles/BuildIdKind.java
new file mode 100644
index 00000000000..9852b623aed
--- /dev/null
+++ b/exporters/otlp/profiles/src/main/java/io/opentelemetry/exporter/otlp/profiles/BuildIdKind.java
@@ -0,0 +1,20 @@
+/*
+ * Copyright The OpenTelemetry Authors
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+package io.opentelemetry.exporter.otlp.profiles;
+
+/**
+ * Indicates the semantics of the build_id field.
+ *
+ * @see "pprofextended.proto::BuildIdKind"
+ */
+public enum BuildIdKind {
+
+ /** Linker-generated build ID, stored in the ELF binary notes. */
+ LINKER,
+
+ /** Build ID based on the content hash of the binary. */
+ BINARY_HASH;
+}
diff --git a/exporters/otlp/profiles/src/main/java/io/opentelemetry/exporter/otlp/profiles/FunctionData.java b/exporters/otlp/profiles/src/main/java/io/opentelemetry/exporter/otlp/profiles/FunctionData.java
new file mode 100644
index 00000000000..3f246ce4a02
--- /dev/null
+++ b/exporters/otlp/profiles/src/main/java/io/opentelemetry/exporter/otlp/profiles/FunctionData.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright The OpenTelemetry Authors
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+package io.opentelemetry.exporter.otlp.profiles;
+
+import javax.annotation.concurrent.Immutable;
+
+/**
+ * Describes a function.
+ *
+ * @see "pprofextended.proto::Function"
+ */
+@Immutable
+public interface FunctionData {
+
+ /** Name of the function, in human-readable form if available. Index into string table. */
+ long getNameIndex();
+
+ /**
+ * Name of the function, as identified by the system. For instance, it can be a C++ mangled name.
+ * Index into string table.
+ */
+ long getSystemNameIndex();
+
+ /** Source file containing the function. Index into string table. */
+ long getFilenameIndex();
+
+ /** Line number in source file. */
+ long getStartLine();
+}
diff --git a/exporters/otlp/profiles/src/main/java/io/opentelemetry/exporter/otlp/profiles/LabelData.java b/exporters/otlp/profiles/src/main/java/io/opentelemetry/exporter/otlp/profiles/LabelData.java
new file mode 100644
index 00000000000..adc8787bae8
--- /dev/null
+++ b/exporters/otlp/profiles/src/main/java/io/opentelemetry/exporter/otlp/profiles/LabelData.java
@@ -0,0 +1,33 @@
+/*
+ * Copyright The OpenTelemetry Authors
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+package io.opentelemetry.exporter.otlp.profiles;
+
+import javax.annotation.concurrent.Immutable;
+
+/**
+ * Provides additional context for a sample, such as thread ID or allocation size, with optional
+ * units.
+ *
+ * @see "pprofextended.proto::Label"
+ */
+@Immutable
+public interface LabelData {
+
+ /** Index into string table. */
+ long getKeyIndex();
+
+ /** String value of the label data, if applicable. Index into string table */
+ long getStrIndex();
+
+ /** Numeric value of the label data, if applicable. */
+ long getNum();
+
+ /**
+ * Specifies the units of num, applicable only if num is present. Use arbitrary string (for
+ * example, "requests") as a custom count unit.
+ */
+ long getNumUnitIndex();
+}
diff --git a/exporters/otlp/profiles/src/main/java/io/opentelemetry/exporter/otlp/profiles/LineData.java b/exporters/otlp/profiles/src/main/java/io/opentelemetry/exporter/otlp/profiles/LineData.java
new file mode 100644
index 00000000000..b19e53cfa1e
--- /dev/null
+++ b/exporters/otlp/profiles/src/main/java/io/opentelemetry/exporter/otlp/profiles/LineData.java
@@ -0,0 +1,26 @@
+/*
+ * Copyright The OpenTelemetry Authors
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+package io.opentelemetry.exporter.otlp.profiles;
+
+import javax.annotation.concurrent.Immutable;
+
+/**
+ * Details a specific line in a source code, linked to a function.
+ *
+ * @see "pprofextended.proto::Line"
+ */
+@Immutable
+public interface LineData {
+
+ /** The index of the corresponding Function for this line. Index into function table. */
+ long getFunctionIndex();
+
+ /** Line number in source code. */
+ long getLine();
+
+ /** Column number in source code. */
+ long getColumn();
+}
diff --git a/exporters/otlp/profiles/src/main/java/io/opentelemetry/exporter/otlp/profiles/LinkData.java b/exporters/otlp/profiles/src/main/java/io/opentelemetry/exporter/otlp/profiles/LinkData.java
new file mode 100644
index 00000000000..dd76c9283b2
--- /dev/null
+++ b/exporters/otlp/profiles/src/main/java/io/opentelemetry/exporter/otlp/profiles/LinkData.java
@@ -0,0 +1,26 @@
+/*
+ * Copyright The OpenTelemetry Authors
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+package io.opentelemetry.exporter.otlp.profiles;
+
+import javax.annotation.concurrent.Immutable;
+
+/**
+ * A connection from a profile Sample to a trace Span.
+ *
+ * @see "pprofextended.proto::Link"
+ */
+@Immutable
+public interface LinkData {
+
+ /**
+ * Returns a unique identifier of a trace that this linked span is part of as 32 character
+ * lowercase hex String.
+ */
+ String getTraceId();
+
+ /** Returns a unique identifier for the linked span, as 16 character lowercase hex String. */
+ String getSpanId();
+}
diff --git a/exporters/otlp/profiles/src/main/java/io/opentelemetry/exporter/otlp/profiles/LocationData.java b/exporters/otlp/profiles/src/main/java/io/opentelemetry/exporter/otlp/profiles/LocationData.java
new file mode 100644
index 00000000000..d22ba65c55d
--- /dev/null
+++ b/exporters/otlp/profiles/src/main/java/io/opentelemetry/exporter/otlp/profiles/LocationData.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright The OpenTelemetry Authors
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+package io.opentelemetry.exporter.otlp.profiles;
+
+import java.util.List;
+import javax.annotation.concurrent.Immutable;
+
+/**
+ * Describes a function.
+ *
+ * @see "pprofextended.proto::Location"
+ */
+@Immutable
+public interface LocationData {
+
+ /**
+ * The index of the corresponding profile.Mapping for this location. It can be unset if the
+ * mapping is unknown or not applicable for this profile type.
+ */
+ long getMappingIndex();
+
+ /** The instruction address for this location, if available. */
+ long getAddress();
+
+ /**
+ * Multiple line indicates this location has inlined functions, where the last entry represents
+ * the caller into which the preceding entries were inlined.
+ */
+ List This number may be larger than the number of attributes that are attached to this profile
+ * container, if the total number recorded was greater than the configured maximum value.
+ */
+ int getTotalAttributeCount();
+
+ /**
+ * Returns the format of the original payload. Common values are defined in semantic conventions.
+ * [required if original_payload is present]
+ */
+ @Nullable
+ String getOriginalPayloadFormat();
+
+ /**
+ * Returns the original payload, in a profiler-native format e.g. JFR. Optional. Default behavior
+ * should be to not include the original payload. If the original payload is in pprof format, it
+ * SHOULD not be included in this field.
+ */
+ ByteBuffer getOriginalPayload();
+
+ /** Returns an extended pprof profile. Required, even when originalPayload is also present. */
+ ProfileData getProfile();
+}
diff --git a/exporters/otlp/profiles/src/main/java/io/opentelemetry/exporter/otlp/profiles/ProfileData.java b/exporters/otlp/profiles/src/main/java/io/opentelemetry/exporter/otlp/profiles/ProfileData.java
new file mode 100644
index 00000000000..63b26401de9
--- /dev/null
+++ b/exporters/otlp/profiles/src/main/java/io/opentelemetry/exporter/otlp/profiles/ProfileData.java
@@ -0,0 +1,87 @@
+/*
+ * Copyright The OpenTelemetry Authors
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+package io.opentelemetry.exporter.otlp.profiles;
+
+import io.opentelemetry.api.common.Attributes;
+import java.util.List;
+import javax.annotation.concurrent.Immutable;
+
+/**
+ * Represents a complete profile, including sample types, samples, mappings to binaries, locations,
+ * functions, string table, and additional metadata.
+ *
+ * @see "pprofextended.proto::Profile"
+ */
+@Immutable
+public interface ProfileData {
+
+ /** A description of the samples associated with each Sample.value. */
+ List