PHP code example of jellytony / observability

1. Go to this page and download the library: Download jellytony/observability library. Choose the download type require.

2. Extract the ZIP file and open the index.php.

3. Add this code to the index.php.
    
        
<?php
require_once('vendor/autoload.php');

/* Start to develop here. Best regards https://php-download.com/ */

    

jellytony / observability example snippets


   JellyTony\Observability\ObservabilityServiceProvider::class,
   JellyTony\Observability\LogServiceProvider::class,
   

   $app->register(JellyTony\Observability\ObservabilityServiceProvider::class); // 注册 ObservabilityServiceProvider 提供器, 注意 顺序, 这个一定要在 LogServiceProvider 之前
   $app->register(JellyTony\Observability\LogServiceProvider::class); // 注册 LogServiceProvider 提供器
   

   
   
   return [
   
       /*
       |--------------------------------------------------------------------------
       | Service Name
       |--------------------------------------------------------------------------
       |
       | Use this to lookup your application (microservice) on a tracing dashboard.
       |
       */
   
       'service_name' => env('APP_NAME', 'microservice'),
   
       'log_path' => env('LOG_PATH', storage_path("logs/lumen.log")),
   
       /*
       |--------------------------------------------------------------------------
       | Tracing Driver
       |--------------------------------------------------------------------------
       |
       | If you're a Jaeger user, we recommend you avail of zipkin driver with zipkin
       | compatible HTTP endpoint. Refer to Jaeger documentation for more details.
       |
       | Supported: "zipkin", "null"
       |
       */
   
       'driver' => env('TRACING_DRIVER', 'zipkin'),
   
       /*
       |--------------------------------------------------------------------------
       | Zipkin
       |--------------------------------------------------------------------------
       |
       | Configure settings for a zipkin driver like whether you want to use
       | 128-bit Trace IDs and what is the max value size for flushed span
       | tags in bytes. Values bigger than this amount will be discarded
       | but you will still see whether certain tag was reported or not.
       |
       */
   
       'zipkin' => [
           'endpoint' => env('zipkin.HttpReporterUrl', 'http://127.0.0.1:9411/api/v2/spans'),
           'options' => [
               '128bit' => env('zipkin.128bit', false),
               'max_tag_len' => env('zipkin.max_tag_len', 1048576),
               'request_timeout' => env("zipkin.HttpReporterTimeout", 5),
           ],
           'sampler_class' => \Zipkin\Samplers\BinarySampler::class,
           'percentage_sampler_rate' => env('zipkin.Rate', 1),
       ],
   
       /*
       |--------------------------------------------------------------------------
       | Middleware
       |--------------------------------------------------------------------------
       */
   
       'middleware' => [
           'server' => [
               // Logging Middleware Configuration
               'logging' => [
                   'disabled' => env('MIDDLEWARE_SERVER_LOGGING_DISABLED', false), // 是否禁用请求日志
                   'time_format' => env('MIDDLEWARE_SERVER_LOGGING_TIME_FORMAT', 'Y-m-d H:i:s'), // 时间格式
                   'latency_threshold' => env('MIDDLEWARE_SERVER_REQUEST_LATENCY_THRESHOLD', 3000), // 延迟阈值,默认为 3 秒
                   'access_level' => env('MIDDLEWARE_SERVER_LOGGING_ACCESS_LEVEL', 'info'), // 请求日志级别,默认为 info,分为 info 和 debug 两种
                   'excluded_paths' => env('MIDDLEWARE_SERVER_LOGGING_EXCLUDED_PATHS', []), // 不记录的请求路径
                   'request_body' => env('MIDDLEWARE_SERVER_LOGGING_REQUEST_BODY', false), // 是否记录请求参数
                   'request_body_max_size' => env('MIDDLEWARE_SERVER_LOGGING_REQUEST_BODY_MAX_SIZE', 102400), // 请求参数最大值,默认为 2kb
                   'request_headers' => env('MIDDLEWARE_SERVER_LOGGING_REQUEST_HEADERS', false), // 是否记录请求头
                   'response_body' => env('MIDDLEWARE_SERVER_LOGGING_RESPONSE_BODY', false), // 是否记录返回数据
                   'response_body_max_size' => env('MIDDLEWARE_SERVER_LOGGING_RESPONSE_BODY_MAX_SIZE', 102400), // 请求参数最大值,默认为 2kb
                   'response_headers' => env('MIDDLEWARE_SERVER_LOGGING_RESPONSE_HEADERS', false), // 是否记录返回头
                   'allowed_headers' => env('MIDDLEWARE_SERVER_LOGGING_ALLOWED_HEADERS', ['Content-Type', 'Authorization']), // 允许的头部
                   'sensitive_headers' => env('MIDDLEWARE_SERVER_LOGGING_SENSITIVE_HEADERS', ['Authorization', 'Cookie']), // 敏感的头部
                   'sensitive_input' => env('MIDDLEWARE_SERVER_LOGGING_SENSITIVE_INPUT', ['password']), // 敏感的输入
               ],
   
               // Trace Middleware Configuration
               'trace' => [
                   'disabled' => env('MIDDLEWARE_SERVER_TRACE_DISABLED', false), // 是否禁用
                   'latency_threshold' => env('MIDDLEWARE_SERVER_TRACE_LATENCY_THRESHOLD', 3000),  // 延迟阈值, 默认为 3 秒
                   'excluded_paths' => env('MIDDLEWARE_SERVER_TRACE_EXCLUDED_PATHS', []), // 不记录的请求路径
                   'request_body' => env('MIDDLEWARE_SERVER_TRACE_REQUEST_BODY', false), // 是否记录请求参数
                   'request_body_max_size' => env('MIDDLEWARE_SERVER_TRACE_REQUEST_BODY_MAX_SIZE', 102400), // 请求参数最大值,默认为 2kb
                   'request_headers' => env('MIDDLEWARE_SERVER_TRACE_REQUEST_HEADERS', false), // 是否记录请求头
                   'response_body' => env('MIDDLEWARE_SERVER_TRACE_RESPONSE_BODY', false), // 是否记录返回数据
                   'response_body_max_size' => env('MIDDLEWARE_SERVER_TRACE_RESPONSE_BODY_MAX_SIZE', 102400), // 请求参数最大值,默认为 2kb
                   'response_headers' => env('MIDDLEWARE_SERVER_TRACE_RESPONSE_HEADERS', false), // 是否记录返回头
                   'allowed_headers' => env('MIDDLEWARE_SERVER_TRACE_ALLOWED_HEADERS', ['Content-Type', 'Authorization']), // 允许的头部
                   'sensitive_headers' => env('MIDDLEWARE_SERVER_TRACE_SENSITIVE_HEADERS', ['Authorization', 'Cookie']), // 敏感的头部
                   'sensitive_input' => env('MIDDLEWARE_SERVER_TRACE_SENSITIVE_INPUT', ['password']), // 敏感的输入
               ],
           ],
   
           'client' => [
               // Logging Middleware Configuration
               'logging' => [
                   'disabled' => env('MIDDLEWARE_CLIENT_LOGGING_DISABLED', false), // 是否禁用请求日志
                   'time_format' => env('MIDDLEWARE_CLIENT_LOGGING_TIME_FORMAT', 'Y-m-d H:i:s'), // 时间格式
                   'latency_threshold' => env('MIDDLEWARE_CLIENT_REQUEST_LATENCY_THRESHOLD', 3000), // 延迟阈值,默认为 3 秒
                   'access_level' => env('MIDDLEWARE_CLIENT_LOGGING_ACCESS_LEVEL', 'info'), // 请求日志级别,默认为 info,分为 info 和 debug 两种
                   'excluded_paths' => env('MIDDLEWARE_CLIENT_LOGGING_EXCLUDED_PATHS', []), // 不记录的请求路径
                   'request_body' => env('MIDDLEWARE_CLIENT_LOGGING_REQUEST_BODY', false), // 是否记录请求参数
                   'request_body_max_size' => env('MIDDLEWARE_CLIENT_LOGGING_REQUEST_BODY_MAX_SIZE', 102400), // 请求参数最大值,默认为 2kb
                   'request_headers' => env('MIDDLEWARE_CLIENT_LOGGING_REQUEST_HEADERS', false), // 是否记录请求头
                   'response_body' => env('MIDDLEWARE_CLIENT_LOGGING_RESPONSE_BODY', false), // 是否记录返回数据
                   'response_body_max_size' => env('MIDDLEWARE_CLIENT_LOGGING_RESPONSE_BODY_MAX_SIZE', 102400), // 请求参数最大值,默认为 2kb
                   'response_headers' => env('MIDDLEWARE_CLIENT_LOGGING_RESPONSE_HEADERS', false), // 是否记录返回头
                   'allowed_headers' => env('MIDDLEWARE_CLIENT_LOGGING_ALLOWED_HEADERS', ['Content-Type', 'Authorization']), // 允许的头部
                   'sensitive_headers' => env('MIDDLEWARE_CLIENT_LOGGING_SENSITIVE_HEADERS', ['Authorization', 'Cookie']), // 敏感的头部
                   'sensitive_input' => env('MIDDLEWARE_CLIENT_LOGGING_SENSITIVE_INPUT', ['password']), // 敏感的输入
               ],
   
               // Trace Middleware Configuration
               'trace' => [
                   'disabled' => env('MIDDLEWARE_CLIENT_TRACE_DISABLED', false), // 是否禁用
                   'latency_threshold' => env('MIDDLEWARE_CLIENT_TRACE_LATENCY_THRESHOLD', 3000),  // 延迟阈值, 默认为 3 秒
                   'excluded_paths' => env('MIDDLEWARE_CLIENT_TRACE_EXCLUDED_PATHS', []), // 不记录的请求路径
                   'request_body' => env('MIDDLEWARE_CLIENT_TRACE_REQUEST_BODY', false), // 是否记录请求参数
                   'request_body_max_size' => env('MIDDLEWARE_CLIENT_TRACE_REQUEST_BODY_MAX_SIZE', 102400), // 请求参数最大值,默认为 2kb
                   'request_headers' => env('MIDDLEWARE_CLIENT_TRACE_REQUEST_HEADERS', false), // 是否记录请求头
                   'response_body' => env('MIDDLEWARE_CLIENT_TRACE_RESPONSE_BODY', false), // 是否记录返回数据
                   'response_body_max_size' => env('MIDDLEWARE_CLIENT_TRACE_RESPONSE_BODY_MAX_SIZE', 102400), // 请求参数最大值,默认为 2kb
                   'response_headers' => env('MIDDLEWARE_CLIENT_TRACE_RESPONSE_HEADERS', false), // 是否记录返回头
                   'allowed_headers' => env('MIDDLEWARE_CLIENT_TRACE_ALLOWED_HEADERS', ['Content-Type', 'Authorization']), // 允许的头部
                   'sensitive_headers' => env('MIDDLEWARE_CLIENT_TRACE_SENSITIVE_HEADERS', ['Authorization', 'Cookie']), // 敏感的头部
                   'sensitive_input' => env('MIDDLEWARE_CLIENT_TRACE_SENSITIVE_INPUT', ['password']), // 敏感的输入
               ],
           ]
       ],
   
       /*
       |--------------------------------------------------------------------------
       | Errors
       |--------------------------------------------------------------------------
       |
       | Whether you want to automatically tag span with error=true
       | to denote the operation represented by the Span has failed
       | when error message was logged
       |
       */
   
       'errors' => true,
   
   
   ];
    

protected $middleware = [
    \JellyTony\Observability\Middleware\RequestID::class,
    \JellyTony\Observability\Middleware\Tracing::class,
    \JellyTony\Observability\Middleware\RequestLogging::class,
];

    'request_id' => JellyTony\Observability\Middleware\RequestID::class,
    'tracing' => JellyTony\Observability\Middleware\Tracing::class,
    'logging' => JellyTony\Observability\Middleware\RequestLogging::class,

$app->group(['middleware' => ['request_id','tracing','logging']], function (
    $app->get('/', function () {
        return $app->version();
    })
))

use JellyTony\Observability\Facades\Trace;

$carrier = array_map(function ($header) {
   if ($header[0] == "") {
       return null;
   }
   return $header[0];
}, $request->headers->all());

// 提取请求头到 carrier ,做服务链路关联
$extractor = $this->tracer->getPropagation()->getExtractor(new Map());
$extractedContext = $extractor($carrier);
$spanName = sprintf("HTTP Server %s: %s", $request->method(), $request->path());

// 生成 span信息
$span = $this->tracer->startSpan($spanName, $extractedContext);