agent/php/ElasticApm/Impl/Config/Snapshot.php (206 lines of code) (raw):

<?php /* * Licensed to Elasticsearch B.V. under one or more contributor * license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright * ownership. Elasticsearch B.V. licenses this file to you under * the Apache License, Version 2.0 (the "License"); you may * not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ declare(strict_types=1); namespace Elastic\Apm\Impl\Config; use Elastic\Apm\Impl\Log\Level as LogLevel; use Elastic\Apm\Impl\Log\LoggableInterface; use Elastic\Apm\Impl\Log\LoggableTrait; use Elastic\Apm\Impl\Log\LoggerFactory; use Elastic\Apm\Impl\Util\WildcardListMatcher; /** * Code in this file is part of implementation internals and thus it is not covered by the backward compatibility. * * @internal */ final class Snapshot implements LoggableInterface { // // Steps to add new configuration option (let's assume new option name is `my_new_option'): // // 1) Follow the steps in <repo root>/agent/native/ext/ConfigManager.h to add the new option for C part of the agent. // NOTE: Build C part of the agent after making the changes above and before proceeding to the steps below. // // // 2) Add // // public const MY_NEW_OPTION = 'my_new_option'; // // to class \Elastic\Apm\Impl\Config\OptionNames // // // 3) Add // // OptionNames::MY_NEW_OPTION => new <my_new_option type>OptionMetadata(), // // to class \Elastic\Apm\Impl\Config\AllOptionsMetadata // // // 4) Add // // /** @var <my_new_option type> */ // private $myNewOption; // // to class \Elastic\Apm\Impl\Config\Snapshot // // // 5) Add // // public function myNewOption(): <my_new_option type> // { // return $this->myNewOption; // } // // to class \Elastic\Apm\Impl\Config\Snapshot // // // 6) Add // // OptionNames::MY_NEW_OPTION => <my_new_option type>RawToParsedValues, // // to return value of buildOptionNameToRawToValue() // in class \ElasticApmTests\ComponentTests\ConfigSettingTest // // // 7) Optionally add option specific test such as \ElasticApmTests\ComponentTests\ApiKeyTest // // use SnapshotTrait; use LoggableTrait; public const LOG_LEVEL_STDERR_DEFAULT = LogLevel::CRITICAL; public const LOG_LEVEL_SYSLOG_DEFAULT = LogLevel::INFO; /** @var array<string, mixed> */ private $optNameToParsedValue; /** @var string */ private $apiKey; /** @var bool */ private $astProcessEnabled; /** @var bool */ private $astProcessDebugDumpConvertedBackToSource; /** @var string */ private $astProcessDebugDumpForPathPrefix; /** @var string */ private $astProcessDebugDumpOutDir; /** @var bool */ private $asyncBackendComm; /** @var bool */ private $breakdownMetrics; /** @var bool */ private $captureErrors; /** @var ?WildcardListMatcher */ private $devInternal; /** @var SnapshotDevInternal */ private $devInternalParsed; /** @var ?WildcardListMatcher */ private $disableInstrumentations; /** @var bool */ private $disableSend; /** @var bool */ private $enabled; /** @var ?string */ private $environment; /** @var ?array<string|bool|int|float|null> */ private $globalLabels; /** @var ?string */ private $hostname; /** @var ?int */ private $logLevel; /** @var ?int */ private $logLevelStderr; /** @var ?int */ private $logLevelSyslog; /** @var int */ private $nonKeywordStringMaxLength; /** @var bool */ private $profilingInferredSpansEnabled; /** @var float */ private $profilingInferredSpansMinDuration; /** @var float */ private $profilingInferredSpansSamplingInterval; /** @var WildcardListMatcher */ private $sanitizeFieldNames; /** @var string */ private $secretToken; /** @var float - In milliseconds */ private $serverTimeout; /** @var ?string */ private $serviceName; /** @var ?string */ private $serviceNodeName; /** @var ?string */ private $serviceVersion; /** @var bool */ private $spanCompressionEnabled; /** @var float */ private $spanCompressionExactMatchMaxDuration; /** @var float */ private $spanCompressionSameKindMaxDuration; /** @var float */ private $spanStackTraceMinDuration; /** @var int */ private $stackTraceLimit; /** @var ?WildcardListMatcher */ private $transactionIgnoreUrls; /** @var int */ private $transactionMaxSpans; /** @var float */ private $transactionSampleRate; /** @var ?WildcardListMatcher */ private $urlGroups = null; /** @var bool */ private $verifyServerCert; /** @var int */ private $effectiveLogLevel; /** * Snapshot constructor. * * @param array<string, mixed> $optNameToParsedValue */ public function __construct(array $optNameToParsedValue, LoggerFactory $loggerFactory) { $this->setPropertiesToValuesFrom($optNameToParsedValue); $this->setEffectiveLogLevel(); $this->adaptTransactionSampleRate(); $this->devInternalParsed = new SnapshotDevInternal($this->devInternal, $loggerFactory); } private function setEffectiveLogLevel(): void { $this->effectiveLogLevel = max( ($this->logLevelStderr ?? $this->logLevel) ?? self::LOG_LEVEL_STDERR_DEFAULT, ($this->logLevelSyslog ?? $this->logLevel) ?? self::LOG_LEVEL_SYSLOG_DEFAULT, $this->logLevel ?? LogLevel::OFF ); } private function adaptTransactionSampleRate(): void { if ($this->transactionSampleRate === 0.0) { return; } $minNonZeroValue = 0.0001; if ($this->transactionSampleRate < $minNonZeroValue) { $this->transactionSampleRate = $minNonZeroValue; return; } $this->transactionSampleRate = round( $this->transactionSampleRate, 4 /* <- precision - number of decimal digits */ ); } /** * @param string $optName * * @return mixed */ public function parsedValueFor(string $optName) { return $this->optNameToParsedValue[$optName]; } public function astProcessEnabled(): bool { return $this->astProcessEnabled; } public function breakdownMetrics(): bool { return $this->breakdownMetrics; } public function captureErrors(): bool { return $this->captureErrors; } public function devInternal(): SnapshotDevInternal { return $this->devInternalParsed; } public function disableInstrumentations(): ?WildcardListMatcher { return $this->disableInstrumentations; } public function disableSend(): bool { return $this->disableSend; } public function effectiveLogLevel(): int { return $this->effectiveLogLevel; } public function enabled(): bool { return $this->enabled; } public function environment(): ?string { return $this->environment; } /** * @return ?array<string|bool|int|float|null> */ public function globalLabels(): ?array { return $this->globalLabels; } public function hostname(): ?string { return $this->hostname; } public function nonKeywordStringMaxLength(): int { return $this->nonKeywordStringMaxLength; } public function profilingInferredSpansEnabled(): bool { return $this->profilingInferredSpansEnabled; } public function profilingInferredSpansMinDurationInMilliseconds(): float { return $this->profilingInferredSpansMinDuration; } public function profilingInferredSpansSamplingInterval(): float { return $this->profilingInferredSpansSamplingInterval; } public function sanitizeFieldNames(): WildcardListMatcher { return $this->sanitizeFieldNames; } public function serverTimeout(): float { return $this->serverTimeout; } public function serviceName(): ?string { return $this->serviceName; } public function serviceNodeName(): ?string { return $this->serviceNodeName; } public function serviceVersion(): ?string { return $this->serviceVersion; } public function spanCompressionEnabled(): bool { return $this->spanCompressionEnabled; } public function spanCompressionExactMatchMaxDuration(): float { return $this->spanCompressionExactMatchMaxDuration; } public function spanCompressionSameKindMaxDuration(): float { return $this->spanCompressionSameKindMaxDuration; } public function spanStackTraceMinDuration(): float { return $this->spanStackTraceMinDuration; } public function stackTraceLimit(): int { return $this->stackTraceLimit; } public function transactionIgnoreUrls(): ?WildcardListMatcher { return $this->transactionIgnoreUrls; } public function transactionMaxSpans(): int { return $this->transactionMaxSpans; } public function transactionSampleRate(): float { return $this->transactionSampleRate; } public function urlGroups(): ?WildcardListMatcher { return $this->urlGroups; } }