Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
70 commits
Select commit Hold shift + click to select a range
67dcb98
Add files via upload
hilmarf Sep 19, 2025
4a5fea3
Merge branch 'open-telemetry:main' into main
hilmarf Sep 23, 2025
35dc562
Merge branch 'open-telemetry:main' into main
hilmarf Sep 25, 2025
63a5aa8
Merge branch 'open-telemetry:main' into main
hilmarf Sep 30, 2025
164029c
Merge branch 'open-telemetry:main' into main
hilmarf Oct 2, 2025
18026f4
Merge branch 'open-telemetry:main' into main
hilmarf Oct 7, 2025
cf41985
Merge branch 'open-telemetry:main' into main
hilmarf Oct 13, 2025
3be8bad
Merge branch 'open-telemetry:main' into main
hilmarf Oct 14, 2025
c1807fd
Merge branch 'open-telemetry:main' into main
hilmarf Oct 16, 2025
01dbfa0
Merge branch 'open-telemetry:main' into main
hilmarf Oct 21, 2025
c96ba6e
Merge branch 'open-telemetry:main' into main
hilmarf Oct 23, 2025
1de49cd
Merge branch 'open-telemetry:main' into main
hilmarf Oct 28, 2025
eebd700
Merge branch 'open-telemetry:main' into main
hilmarf Oct 30, 2025
00d6137
Merge branch 'open-telemetry:main' into main
hilmarf Nov 4, 2025
20836fb
Merge branch 'open-telemetry:main' into main
hilmarf Nov 6, 2025
1ce27ad
Merge branch 'open-telemetry:main' into main
hilmarf Nov 11, 2025
785c1bd
Merge branch 'open-telemetry:main' into main
hilmarf Nov 18, 2025
5b14a76
Merge branch 'open-telemetry:main' into main
hilmarf Nov 20, 2025
52ada35
Merge branch 'open-telemetry:main' into main
hilmarf Nov 25, 2025
b316e4d
Merge branch 'open-telemetry:main' into main
hilmarf Nov 27, 2025
aad7547
Merge branch 'open-telemetry:main' into main
hilmarf Dec 2, 2025
2617e8f
Merge branch 'open-telemetry:main' into main
hilmarf Dec 4, 2025
6b3ae9d
Merge branch 'open-telemetry:main' into main
hilmarf Dec 9, 2025
a0ffdf2
Merge branch 'open-telemetry:main' into main
hilmarf Dec 11, 2025
ef1b811
Merge branch 'open-telemetry:main' into main
hilmarf Dec 15, 2025
e2c4ef1
Merge branch 'open-telemetry:main' into main
hilmarf Dec 16, 2025
9e65510
Merge branch 'open-telemetry:main' into main
hilmarf Dec 18, 2025
7b86e4d
Merge branch 'open-telemetry:main' into main
hilmarf Dec 23, 2025
b80e1f2
Merge branch 'open-telemetry:main' into main
hilmarf Dec 25, 2025
5958cc8
Merge branch 'open-telemetry:main' into main
hilmarf Dec 30, 2025
9be15b1
Merge branch 'open-telemetry:main' into main
hilmarf Jan 1, 2026
daf96e4
Merge branch 'open-telemetry:main' into main
hilmarf Jan 6, 2026
8923e74
Merge branch 'open-telemetry:main' into main
hilmarf Jan 7, 2026
59c7acf
Merge branch 'open-telemetry:main' into main
hilmarf Jan 8, 2026
be495f6
Merge branch 'open-telemetry:main' into main
hilmarf Jan 13, 2026
f03637d
Merge branch 'open-telemetry:main' into main
hilmarf Jan 15, 2026
572d3e7
Merge branch 'open-telemetry:main' into main
hilmarf Jan 20, 2026
6ca3912
Merge branch 'open-telemetry:main' into main
hilmarf Jan 22, 2026
7cc8ddf
Merge branch 'open-telemetry:main' into main
hilmarf Jan 27, 2026
895b5ae
Merge branch 'open-telemetry:main' into main
hilmarf Jan 29, 2026
72269d4
Merge branch 'open-telemetry:main' into main
hilmarf Feb 3, 2026
947dde1
Merge branch 'open-telemetry:main' into main
hilmarf Feb 5, 2026
52d68a0
Merge branch 'open-telemetry:main' into main
hilmarf Feb 10, 2026
c2dcf90
Merge branch 'open-telemetry:main' into main
hilmarf Feb 12, 2026
1579d3e
Merge branch 'open-telemetry:main' into main
hilmarf Feb 17, 2026
c3c62e9
Merge branch 'open-telemetry:main' into main
hilmarf Feb 19, 2026
acd7d4d
Merge branch 'open-telemetry:main' into main
hilmarf Feb 24, 2026
1e0267b
Merge branch 'open-telemetry:main' into main
hilmarf Feb 26, 2026
ad20711
Merge branch 'open-telemetry:main' into main
hilmarf Mar 3, 2026
c2a4fd2
Merge branch 'open-telemetry:main' into main
hilmarf Mar 5, 2026
2dc640f
Merge branch 'open-telemetry:main' into main
hilmarf Mar 10, 2026
4d2f15e
Merge branch 'open-telemetry:main' into main
hilmarf Mar 12, 2026
b289d71
Merge branch 'open-telemetry:main' into main
hilmarf Mar 17, 2026
9032a64
Merge branch 'open-telemetry:main' into main
hilmarf Mar 19, 2026
b007346
Merge branch 'open-telemetry:main' into main
hilmarf Mar 24, 2026
8f7bc50
Merge branch 'open-telemetry:main' into main
hilmarf Mar 26, 2026
59a9914
Merge branch 'open-telemetry:main' into main
hilmarf Mar 31, 2026
3d9f7da
Merge branch 'open-telemetry:main' into main
hilmarf Apr 1, 2026
029b5f1
Merge branch 'open-telemetry:main' into main
hilmarf Apr 2, 2026
e56a574
Merge branch 'open-telemetry:main' into main
hilmarf Apr 7, 2026
188b424
Merge branch 'open-telemetry:main' into main
hilmarf Apr 9, 2026
b55cb63
Merge branch 'open-telemetry:main' into main
hilmarf Apr 14, 2026
621e817
Merge branch 'open-telemetry:main' into main
hilmarf Apr 16, 2026
5b81ec2
Merge branch 'open-telemetry:main' into main
hilmarf Apr 21, 2026
12a7d3b
Merge branch 'open-telemetry:main' into main
hilmarf Apr 23, 2026
521077a
Merge branch 'open-telemetry:main' into main
hilmarf Apr 27, 2026
93cedd5
Merge branch 'open-telemetry:main' into main
hilmarf Apr 28, 2026
1903a21
Add initial audit logging pipeline:
hilmarf Apr 28, 2026
4df71f6
Merge branch 'main' into auditing
hilmarf Apr 28, 2026
4f9a744
refactor: migrated the separate package `api\audit` into `api\all`
hilmarf Apr 28, 2026
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
23 changes: 23 additions & 0 deletions api/all/src/main/java/io/opentelemetry/api/audit/ActorType.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
/*
* Copyright The OpenTelemetry Authors
* SPDX-License-Identifier: Apache-2.0
*/

package io.opentelemetry.api.audit;

/**
* Classifies the kind of entity that performed an auditable action.
*
* @see AuditRecordBuilder#setActorType(ActorType)
*/
public enum ActorType {

/** A human user, identified by a user account. */
USER,

/** An automated service, daemon, or service account. */
SERVICE,

/** The operating system or a privileged system component. */
SYSTEM
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
/*
* Copyright The OpenTelemetry Authors
* SPDX-License-Identifier: Apache-2.0
*/

package io.opentelemetry.api.audit;

/**
* Hard-error thrown by {@link AuditRecordBuilder#emit()} when the audit sink cannot be reached and
* all retries are exhausted. This is an unchecked exception so that audit-logging call sites remain
* clean, but callers SHOULD catch it and escalate the failure through their incident-management
* process.
*/
public final class AuditDeliveryException extends RuntimeException {

private static final long serialVersionUID = 1L;

public AuditDeliveryException(String message) {
super(message);
}

public AuditDeliveryException(String message, Throwable cause) {
super(message, cause);
}
}
25 changes: 25 additions & 0 deletions api/all/src/main/java/io/opentelemetry/api/audit/AuditLogger.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
/*
* Copyright The OpenTelemetry Authors
* SPDX-License-Identifier: Apache-2.0
*/

package io.opentelemetry.api.audit;

import javax.annotation.concurrent.ThreadSafe;

/**
* The entry point for emitting audit records.
*
* <p>Obtain an {@link AuditRecordBuilder} via {@link #auditRecordBuilder()}, populate all required
* fields, and call {@link AuditRecordBuilder#emit()} to deliver the record to the audit sink.
*
* <p>Unlike {@link io.opentelemetry.api.logs.Logger}, this interface does <em>not</em> expose an
* {@code isEnabled} check: audit records are ALWAYS emitted. Dropping audit records is prohibited
* by the audit logging specification.
*/
@ThreadSafe
public interface AuditLogger {

/** Returns an {@link AuditRecordBuilder} for constructing and emitting an audit record. */
AuditRecordBuilder auditRecordBuilder();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
/*
* Copyright The OpenTelemetry Authors
* SPDX-License-Identifier: Apache-2.0
*/

package io.opentelemetry.api.audit;

/**
* Builder for creating named {@link AuditLogger} instances.
*
* <p>The {@code name} (set on the owning {@link AuditProvider}) is stored as a diagnostic label on
* the logger. Unlike {@link io.opentelemetry.api.logs.LoggerBuilder}, the name is NOT mapped to an
* OTLP {@code InstrumentationScope}.
*/
public interface AuditLoggerBuilder {

/**
* Sets the schema URL to be recorded on emitted {@link AuditRecordBuilder}s for semantic
* convention versioning.
*/
AuditLoggerBuilder setSchemaUrl(String schemaUrl);

/** Sets the version of the component or library that is emitting audit records. */
AuditLoggerBuilder setInstrumentationVersion(String instrumentationVersion);

/** Returns the configured {@link AuditLogger}. */
AuditLogger build();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
/*
* Copyright The OpenTelemetry Authors
* SPDX-License-Identifier: Apache-2.0
*/

package io.opentelemetry.api.audit;

import javax.annotation.concurrent.ThreadSafe;

/**
* The entry point of the Audit Logging API. Provides named {@link AuditLogger} instances.
*
* <p>The provider is expected to be accessed from a central place. Use {@link
* GlobalAuditProvider#get()} to obtain the globally registered instance, or create an {@link
* AuditProvider} directly via the SDK.
*
* <p>When no SDK is installed, {@link #noop()} returns an {@link AuditProvider} whose loggers emit
* no-op receipts without error.
*/
@ThreadSafe
public interface AuditProvider {

/**
* Gets or creates a named {@link AuditLogger} instance.
*
* @param name A string identifying the component or subsystem emitting audit records (for example
* {@code "com.example.auth"}). MUST NOT be empty.
*/
default AuditLogger get(String name) {
return auditLoggerBuilder(name).build();
}

/**
* Creates an {@link AuditLoggerBuilder} for a named {@link AuditLogger}.
*
* @param name A string identifying the component or subsystem emitting audit records. MUST NOT be
* empty.
*/
AuditLoggerBuilder auditLoggerBuilder(String name);

/**
* Returns a no-op {@link AuditProvider} whose loggers return no-op {@link AuditReceipt}s
* immediately without error.
*/
static AuditProvider noop() {
return DefaultAuditProvider.getInstance();
}
}
87 changes: 87 additions & 0 deletions api/all/src/main/java/io/opentelemetry/api/audit/AuditReceipt.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
/*
* Copyright The OpenTelemetry Authors
* SPDX-License-Identifier: Apache-2.0
*/

package io.opentelemetry.api.audit;

import javax.annotation.concurrent.Immutable;

/**
* Proof-of-delivery returned by {@link AuditLogger} once the audit sink has persisted the record.
*
* <p>The {@code recordId} echoes the caller's {@link AuditRecordBuilder#setRecordId(String)}.
* {@code integrityHash} is the SHA-256 of the record as written by the sink. {@code
* sinkTimestampEpochNanos} is the nanosecond UNIX epoch at which the sink persisted the record.
*/
@Immutable
public final class AuditReceipt {

private final String recordId;
private final String integrityHash;
private final long sinkTimestampEpochNanos;

private AuditReceipt(String recordId, String integrityHash, long sinkTimestampEpochNanos) {
this.recordId = recordId;
this.integrityHash = integrityHash;
this.sinkTimestampEpochNanos = sinkTimestampEpochNanos;
}

/** Creates an {@link AuditReceipt} with the given fields. */
public static AuditReceipt create(
String recordId, String integrityHash, long sinkTimestampEpochNanos) {
return new AuditReceipt(recordId, integrityHash, sinkTimestampEpochNanos);
}

/** Returns the {@code RecordId} echoed from the corresponding {@link AuditRecordBuilder}. */
public String recordId() {
return recordId;
}

/**
* Returns the SHA-256 hex digest of the canonical serialization of the {@code AuditRecord} as
* persisted by the audit sink.
*/
public String integrityHash() {
return integrityHash;
}

/** Returns the nanosecond UNIX epoch at which the audit sink persisted the record. */
public long sinkTimestampEpochNanos() {
return sinkTimestampEpochNanos;
}

@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (!(obj instanceof AuditReceipt)) {
return false;
}
AuditReceipt other = (AuditReceipt) obj;
return recordId.equals(other.recordId)
&& integrityHash.equals(other.integrityHash)
&& sinkTimestampEpochNanos == other.sinkTimestampEpochNanos;
}

@Override
public int hashCode() {
int result = recordId.hashCode();
result = 31 * result + integrityHash.hashCode();
result = 31 * result + Long.hashCode(sinkTimestampEpochNanos);
return result;
}

@Override
public String toString() {
return "AuditReceipt{"
+ "recordId="
+ recordId
+ ", integrityHash="
+ integrityHash
+ ", sinkTimestampEpochNanos="
+ sinkTimestampEpochNanos
+ "}";
}
}
Loading
Loading