DSL References
DSL stands for Domain Specific Language. In Flow, the DSL is a set of small functions that wrap object construction so pipelines read top-to-bottom. See the examples for usage in context.
HELPER
/**
* Create a LogRecordConverter for converting Monolog LogRecord to Telemetry LogRecord.
*
* The converter handles:
* - Severity mapping from Monolog Level to Telemetry Severity
* - Message body conversion
* - Channel and level name as monolog.* attributes
* - Context values as context.* attributes (Throwables use setException())
* - Extra values as extra.* attributes
*
* @param null|SeverityMapper $severityMapper Custom severity mapper (defaults to standard mapping)
* @param null|ValueNormalizer $valueNormalizer Custom value normalizer (defaults to standard normalizer)
*
* Example usage:
* ```php
* $converter = log_record_converter();
* $telemetryRecord = $converter->convert($monologRecord);
* ```
*
* Example with custom mapper:
* ```php
* $converter = log_record_converter(
* severityMapper: severity_mapper([
* Level::Debug->value => Severity::TRACE,
* ])
* );
* ```
*/
log_record_converter(?SeverityMapper $severityMapper, ?ValueNormalizer $valueNormalizer) : LogRecordConverter /**
* Create a SeverityMapper for mapping Monolog levels to Telemetry severities.
*
* @param null|array<int, Severity> $customMapping Optional custom mapping (Monolog Level value => Telemetry Severity)
*
* Example with default mapping:
* ```php
* $mapper = severity_mapper();
* ```
*
* Example with custom mapping:
* ```php
* use Monolog\Level;
* use Flow\Telemetry\Logger\Severity;
*
* $mapper = severity_mapper([
* Level::Debug->value => Severity::DEBUG,
* Level::Info->value => Severity::INFO,
* Level::Notice->value => Severity::WARN, // Custom: NOTICE → WARN instead of INFO
* Level::Warning->value => Severity::WARN,
* Level::Error->value => Severity::ERROR,
* Level::Critical->value => Severity::FATAL,
* Level::Alert->value => Severity::FATAL,
* Level::Emergency->value => Severity::FATAL,
* ]);
* ```
*/
severity_mapper(?array $customMapping) : SeverityMapper /**
* Create a TelemetryHandler for forwarding Monolog logs to Flow Telemetry.
*
* @param Logger $logger The Flow Telemetry logger to forward logs to
* @param LogRecordConverter $converter Converter to transform Monolog LogRecord to Telemetry LogRecord
* @param Level $level The minimum logging level at which this handler will be triggered
* @param bool $bubble Whether messages handled by this handler should bubble up to other handlers
*
* Example usage:
* ```php
* use Monolog\Logger as MonologLogger;
* use function Flow\Bridge\Monolog\Telemetry\DSL\telemetry_handler;
* use function Flow\Telemetry\DSL\telemetry;
*
* $telemetry = telemetry();
* $logger = $telemetry->logger('my-app');
*
* $monolog = new MonologLogger('channel');
* $monolog->pushHandler(telemetry_handler($logger));
*
* $monolog->info('User logged in', ['user_id' => 123]);
* // → Forwarded to Flow Telemetry with INFO severity
* ```
*
* Example with custom converter:
* ```php
* $converter = log_record_converter(
* severityMapper: severity_mapper([
* Level::Debug->value => Severity::TRACE,
* ])
* );
* $monolog->pushHandler(telemetry_handler($logger, $converter));
* ```
*/
telemetry_handler(Logger $logger, LogRecordConverter $converter, Level $level, bool $bubble, ErrorHandler $errorHandler) : TelemetryHandler /**
* Create a ValueNormalizer for converting arbitrary PHP values to Telemetry attribute types.
*
* The normalizer handles:
* - null → 'null' string
* - scalars (string, int, float, bool) → unchanged
* - DateTimeInterface → unchanged
* - Throwable → unchanged
* - arrays → recursively normalized
* - objects with __toString() → string cast
* - objects without __toString() → class name
* - other types → get_debug_type() result
*
* Example usage:
* ```php
* $normalizer = value_normalizer();
* $normalized = $normalizer->normalize($value);
* ```
*/
value_normalizer() : ValueNormalizer