blob: b7fdcf5f83132861ccd2a9a4fc0775711b678ab7 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
|
<?php
declare(strict_types=1);
namespace OpenTelemetry\SDK\Metrics;
use ArrayAccess;
use OpenTelemetry\API\Metrics\ObservableCallbackInterface;
use OpenTelemetry\API\Metrics\ObserverInterface;
use function OpenTelemetry\SDK\Common\Util\closure;
use function OpenTelemetry\SDK\Common\Util\weaken;
use OpenTelemetry\SDK\Metrics\MetricRegistry\MetricWriterInterface;
/**
* @internal
*/
trait ObservableInstrumentTrait
{
private MetricWriterInterface $writer;
private Instrument $instrument;
private ReferenceCounterInterface $referenceCounter;
private ArrayAccess $destructors;
public function __construct(
MetricWriterInterface $writer,
Instrument $instrument,
ReferenceCounterInterface $referenceCounter,
ArrayAccess $destructors
) {
$this->writer = $writer;
$this->instrument = $instrument;
$this->referenceCounter = $referenceCounter;
$this->destructors = $destructors;
$this->referenceCounter->acquire();
}
public function __destruct()
{
$this->referenceCounter->release();
}
/**
* @param callable(ObserverInterface): void $callback
*/
public function observe(callable $callback): ObservableCallbackInterface
{
$callback = weaken(closure($callback), $target);
$callbackId = $this->writer->registerCallback($callback, $this->instrument);
$this->referenceCounter->acquire();
$destructor = null;
if ($target) {
$destructor = $this->destructors[$target] ??= new ObservableCallbackDestructor($this->writer, $this->referenceCounter);
$destructor->callbackIds[$callbackId] = $callbackId;
}
return new ObservableCallback($this->writer, $this->referenceCounter, $callbackId, $destructor, $target);
}
}
|