Skip to content

Commit b63ee6a

Browse files
authored
Add Logger::logRecordBuilder() (#1859)
* Add `Logger::logRecordBuilder()` * Duplicate current `Logger` tests for `LogRecordBuilder` * Update SDK branch alias * Update SDK conflict version in API package * Add log record span context test * Add `CoversClass` `LogRecordBuilder` attribute
1 parent 45bda7e commit b63ee6a

7 files changed

Lines changed: 201 additions & 1 deletion

Logs/LateBindingLogger.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,12 @@ public function __construct(
1717
) {
1818
}
1919

20+
#[\Override]
21+
public function logRecordBuilder(): LogRecordBuilderInterface
22+
{
23+
return ($this->logger ??= ($this->factory)())->logRecordBuilder();
24+
}
25+
2026
#[\Override]
2127
public function emit(LogRecord $logRecord): void
2228
{

Logs/LogRecord.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@
66

77
use OpenTelemetry\Context\ContextInterface;
88

9+
/**
10+
* Deprecated, use {@link LoggerInterface::logRecordBuilder()} instead.
11+
*/
912
class LogRecord
1013
{
1114
public const NANOS_PER_SECOND = 1_000_000_000;

Logs/LogRecordBuilderInterface.php

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace OpenTelemetry\API\Logs;
6+
7+
use OpenTelemetry\Context\ContextInterface;
8+
use Throwable;
9+
10+
interface LogRecordBuilderInterface
11+
{
12+
/**
13+
* Time when the event occurred measured by the origin clock, i.e. the time at the source.
14+
*
15+
* @param int $timestamp nanoseconds since UNIX epoch
16+
* @see https://opentelemetry.io/docs/specs/otel/logs/data-model/#field-timestamp
17+
*/
18+
public function setTimestamp(int $timestamp): LogRecordBuilderInterface;
19+
20+
/**
21+
* Time when the event was observed by the collection system
22+
*
23+
* @param int $timestamp nanoseconds since UNIX epoch
24+
* @see https://opentelemetry.io/docs/specs/otel/logs/data-model/#field-observedtimestamp
25+
*/
26+
public function setObservedTimestamp(int $timestamp): LogRecordBuilderInterface;
27+
28+
/**
29+
* @param ContextInterface|false|null $context the log context, null to use the current
30+
* context, false to use no context
31+
* @see https://opentelemetry.io/docs/specs/otel/logs/data-model/#trace-context-fields
32+
*/
33+
public function setContext(ContextInterface|false|null $context): LogRecordBuilderInterface;
34+
35+
/**
36+
* Numerical value of the severity.
37+
*
38+
* @see https://opentelemetry.io/docs/specs/otel/logs/data-model/#field-severitynumber
39+
*/
40+
public function setSeverityNumber(int|Severity $severityNumber): LogRecordBuilderInterface;
41+
42+
/**
43+
* The original string representation of the severity as it is known at the source.
44+
*
45+
* @see https://opentelemetry.io/docs/specs/otel/logs/data-model/#field-severitytext
46+
*/
47+
public function setSeverityText(string $severityText): LogRecordBuilderInterface;
48+
49+
/**
50+
* @see https://opentelemetry.io/docs/specs/otel/logs/data-model/#field-body
51+
*/
52+
public function setBody(mixed $body): LogRecordBuilderInterface;
53+
54+
/**
55+
* @see https://opentelemetry.io/docs/specs/otel/logs/data-model/#field-attributes
56+
*/
57+
public function setAttribute(string $key, mixed $value): LogRecordBuilderInterface;
58+
59+
/**
60+
* @see https://opentelemetry.io/docs/specs/otel/logs/data-model/#field-attributes
61+
*/
62+
public function setAttributes(iterable $attributes): LogRecordBuilderInterface;
63+
64+
/**
65+
* Sets the `exception.message` `exception.type`, and `exception.stacktrace` attributes.
66+
*
67+
* @see https://opentelemetry.io/docs/specs/semconv/exceptions/exceptions-logs/#attributes
68+
*/
69+
public function setException(Throwable $exception): LogRecordBuilderInterface;
70+
71+
/**
72+
* @see https://opentelemetry.io/docs/specs/otel/logs/data-model/#field-eventname
73+
*/
74+
public function setEventName(string $eventName): LogRecordBuilderInterface;
75+
76+
/**
77+
* @see https://opentelemetry.io/docs/specs/otel/logs/api/#emit-a-logrecord
78+
*/
79+
public function emit(): void;
80+
}

Logs/LoggerInterface.php

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,31 @@
88

99
interface LoggerInterface
1010
{
11+
/**
12+
* Deprecated, use {@link LoggerInterface::logRecordBuilder()} instead.
13+
*
14+
* Deprecated:
15+
* ```
16+
* $logger->emit(new LogRecord()
17+
* ->setTimestamp($timestamp)
18+
* ...
19+
* ->setEventName($eventName)
20+
* );
21+
* ```
22+
*
23+
* Instead, use:
24+
* ```
25+
* $logger->logRecordBuilder()
26+
* ->setTimestamp($timestamp)
27+
* ...
28+
* ->setEventName($eventName)
29+
* ->emit();
30+
* ```
31+
*/
1132
public function emit(LogRecord $logRecord): void;
1233

34+
public function logRecordBuilder(): LogRecordBuilderInterface;
35+
1336
/**
1437
* Determine if the logger is enabled. Instrumentation authors SHOULD call this method each time they
1538
* emit a LogRecord, to ensure they have the most up-to-date response.

Logs/NoopLogRecordBuilder.php

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace OpenTelemetry\API\Logs;
6+
7+
use OpenTelemetry\Context\ContextInterface;
8+
use Throwable;
9+
10+
/**
11+
* @psalm-internal OpenTelemetry
12+
*/
13+
final class NoopLogRecordBuilder implements LogRecordBuilderInterface
14+
{
15+
#[\Override]
16+
public function setTimestamp(int $timestamp): LogRecordBuilderInterface
17+
{
18+
return $this;
19+
}
20+
21+
#[\Override]
22+
public function setObservedTimestamp(int $timestamp): LogRecordBuilderInterface
23+
{
24+
return $this;
25+
}
26+
27+
#[\Override]
28+
public function setContext(ContextInterface|false|null $context): LogRecordBuilderInterface
29+
{
30+
return $this;
31+
}
32+
33+
#[\Override]
34+
public function setSeverityNumber(int|Severity $severityNumber): LogRecordBuilderInterface
35+
{
36+
return $this;
37+
}
38+
39+
#[\Override]
40+
public function setSeverityText(string $severityText): LogRecordBuilderInterface
41+
{
42+
return $this;
43+
}
44+
45+
#[\Override]
46+
public function setBody(mixed $body): LogRecordBuilderInterface
47+
{
48+
return $this;
49+
}
50+
51+
#[\Override]
52+
public function setAttribute(string $key, mixed $value): LogRecordBuilderInterface
53+
{
54+
return $this;
55+
}
56+
57+
#[\Override]
58+
public function setAttributes(iterable $attributes): LogRecordBuilderInterface
59+
{
60+
return $this;
61+
}
62+
63+
#[\Override]
64+
public function setException(Throwable $exception): LogRecordBuilderInterface
65+
{
66+
return $this;
67+
}
68+
69+
#[\Override]
70+
public function setEventName(string $eventName): LogRecordBuilderInterface
71+
{
72+
return $this;
73+
}
74+
75+
#[\Override]
76+
public function emit(): void
77+
{
78+
// no-op
79+
}
80+
}

Logs/NoopLogger.php

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,14 @@ public static function getInstance(): self
1818
return $instance ??= new self();
1919
}
2020

21+
#[\Override]
22+
public function logRecordBuilder(): LogRecordBuilderInterface
23+
{
24+
static $logRecordBuilder = new NoopLogRecordBuilder();
25+
26+
return $logRecordBuilder;
27+
}
28+
2129
/**
2230
* @codeCoverageIgnore
2331
*/

composer.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
"symfony/polyfill-php82": "^1.26"
2424
},
2525
"conflict": {
26-
"open-telemetry/sdk": "<=1.0.8"
26+
"open-telemetry/sdk": "<=1.11"
2727
},
2828
"autoload": {
2929
"psr-4": {

0 commit comments

Comments
 (0)