Skip to content
This repository was archived by the owner on Dec 5, 2025. It is now read-only.

Commit 16392ff

Browse files
author
billpyang
committed
feat:新增指标上报
1 parent 747bc77 commit 16392ff

File tree

3 files changed

+141
-0
lines changed

3 files changed

+141
-0
lines changed

src/Facades/Metric.php

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
<?php
2+
3+
namespace Overtrue\LaravelOpenTelemetry\Facades;
4+
5+
use Illuminate\Support\Facades\Facade;
6+
use OpenTelemetry\API\Metrics\CounterInterface;
7+
use OpenTelemetry\API\Metrics\GaugeInterface;
8+
use OpenTelemetry\API\Metrics\HistogramInterface;
9+
use OpenTelemetry\API\Metrics\ObservableGaugeInterface;
10+
11+
/**
12+
* @method static void enable()
13+
* @method static void disable()
14+
* @method static bool isEnabled()
15+
* @method static void reset()
16+
* @method static \OpenTelemetry\API\Metrics\MeterInterface meter()
17+
* @method static \OpenTelemetry\API\Metrics\CounterInterface createCounter(string $name, ?string $unit = null, ?string $description = null, array $advisory = [])
18+
* @method static \OpenTelemetry\API\Metrics\HistogramInterface createHistogram(string $name, ?string $unit = null, ?string $description = null, array $advisory = [])
19+
* @method static \OpenTelemetry\API\Metrics\GaugeInterface createGauge(string $name, ?string $unit = null, ?string $description = null, array $advisory = [])
20+
* @method static \OpenTelemetry\API\Metrics\ObservableGaugeInterface createObservableGauge(string $name, ?string $unit = null, ?string $description = null, array|callable $advisory = [], callable ...$callbacks)
21+
*
22+
* @see \Overtrue\LaravelOpenTelemetry\Support\Metric
23+
*/
24+
class Metric extends Facade
25+
{
26+
protected static function getFacadeAccessor(): string
27+
{
28+
return \Overtrue\LaravelOpenTelemetry\Support\Metric::class;
29+
}
30+
}

src/OpenTelemetryServiceProvider.php

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,11 @@
1010
use Illuminate\Support\ServiceProvider;
1111
use Laravel\Octane\Events;
1212
use OpenTelemetry\API\Globals;
13+
use OpenTelemetry\API\Metrics\MeterInterface;
1314
use OpenTelemetry\API\Trace\TracerInterface;
1415
use Overtrue\LaravelOpenTelemetry\Console\Commands\TestCommand;
1516
use Overtrue\LaravelOpenTelemetry\Facades\Measure;
17+
use Overtrue\LaravelOpenTelemetry\Facades\Metric;
1618
use Overtrue\LaravelOpenTelemetry\Http\Middleware\AddTraceId;
1719
use Overtrue\LaravelOpenTelemetry\Http\Middleware\TraceRequest;
1820

@@ -41,6 +43,7 @@ public function register(): void
4143
__DIR__.'/../config/otel.php', 'otel',
4244
);
4345

46+
// Register Tracer
4447
$this->app->singleton(Support\Measure::class, function ($app) {
4548
return new Support\Measure($app);
4649
});
@@ -54,6 +57,19 @@ public function register(): void
5457

5558
$this->app->alias(TracerInterface::class, 'opentelemetry.tracer');
5659

60+
// Register metric
61+
$this->app->singleton(Support\Metric::class, function ($app) {
62+
return new Support\Metric($app);
63+
});
64+
$this->app->alias(Support\Metric::class, 'opentelemetry.metric');
65+
66+
$this->app->singleton(MeterInterface::class, function () {
67+
return Globals::meterProvider()
68+
->getMeter(config('otel.meter_name', 'overtrue.laravel-open-telemetry'));
69+
});
70+
71+
$this->app->alias(MeterInterface::class, 'opentelemetry.meter');
72+
5773
Log::debug('[laravel-open-telemetry] Service provider registered successfully');
5874
}
5975

src/Support/Metric.php

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
<?php
2+
3+
namespace Overtrue\LaravelOpenTelemetry\Support;
4+
5+
use Illuminate\Contracts\Foundation\Application;
6+
use Illuminate\Support\Facades\Log;
7+
use OpenTelemetry\API\Metrics\GaugeInterface;
8+
use OpenTelemetry\API\Metrics\HistogramInterface;
9+
use OpenTelemetry\API\Metrics\MeterInterface;
10+
use OpenTelemetry\API\Metrics\Noop\NoopMeter;
11+
use OpenTelemetry\API\Metrics\CounterInterface;
12+
use OpenTelemetry\API\Metrics\ObservableGaugeInterface;
13+
use Throwable;
14+
15+
class Metric
16+
{
17+
private static ?bool $enabled = null;
18+
19+
public function __construct(protected Application $app)
20+
{
21+
}
22+
23+
24+
// ======================= Enable/Disable Management =======================
25+
26+
public function enable(): void
27+
{
28+
self::$enabled = true;
29+
}
30+
31+
public function disable(): void
32+
{
33+
self::$enabled = false;
34+
}
35+
36+
public function isEnabled(): bool
37+
{
38+
if (self::$enabled === null) {
39+
return config('otel.enabled', true);
40+
}
41+
42+
return self::$enabled;
43+
}
44+
45+
46+
// ======================= Core OpenTelemetry API =======================
47+
48+
/**
49+
* Get the meter instance
50+
*/
51+
public function meter(): MeterInterface
52+
{
53+
if (!$this->isEnabled()) {
54+
return new NoopMeter;
55+
}
56+
57+
try {
58+
return $this->app->get(MeterInterface::class);
59+
} catch (Throwable $e) {
60+
Log::error('[laravel-open-telemetry] Meter not found', [
61+
'error' => $e->getMessage(),
62+
'line' => $e->getLine(),
63+
'file' => $e->getFile(),
64+
]);
65+
66+
return new NoopMeter;
67+
}
68+
}
69+
70+
public function createCounter(string $name, ?string $unit = null,
71+
?string $description = null, array $advisory = []): CounterInterface
72+
{
73+
return $this->meter()->createCounter($name, $unit, $description, $advisory);
74+
}
75+
76+
public function createHistogram(string $name, ?string $unit = null,
77+
?string $description = null, array $advisory = []): HistogramInterface
78+
{
79+
return $this->meter()->createHistogram($name, $unit, $description, $advisory);
80+
}
81+
82+
public function createGauge(string $name, ?string $unit = null,
83+
?string $description = null, array $advisory = []): GaugeInterface
84+
{
85+
return $this->meter()->createGauge($name, $unit, $description, $advisory);
86+
}
87+
88+
public function createObservableGauge(string $name, ?string $unit = null,
89+
?string $description = null, array|callable $advisory = [], callable ...$callbacks): ObservableGaugeInterface
90+
{
91+
return $this->meter()->createObservableGauge($name, $unit, $description, $advisory, $callbacks);
92+
}
93+
94+
95+
}

0 commit comments

Comments
 (0)