Skip to content

Commit

Permalink
Make new config options dynamic
Browse files Browse the repository at this point in the history
  • Loading branch information
stevejgordon committed Apr 16, 2024
1 parent c039af0 commit 3e68281
Show file tree
Hide file tree
Showing 5 changed files with 52 additions and 10 deletions.
15 changes: 9 additions & 6 deletions docs/configuration.asciidoc
Original file line number Diff line number Diff line change
Expand Up @@ -1078,9 +1078,11 @@ NOTE: Changing this configuration will overwrite the default value.
[[config-transaction-name-groups]]
==== `TransactionNameGroups` (added[1.27.0])

With this option, you can group transaction names that contain dynamic parts with a wildcard expression. For example, the pattern `GET /user/*/cart` would consolidate transactions, such as 'GET /users/42/cart' and 'GET /users/73/cart' into a single transaction name 'GET /users/*/cart', hence reducing the transaction name cardinality.
<<dynamic-configuration, image:./images/dynamic-config.svg[] >>

With this option, you can group transaction names that contain dynamic parts with a wildcard expression. For example, the pattern `GET /user/*/cart` would consolidate transactions, such as `GET /users/42/cart` and `GET /users/73/cart` into a single transaction name `GET /users/*/cart`, hence reducing the transaction name cardinality.

This option supports the wildcard *, which matches zero or more characters. Examples: GET /foo/*/bar/*/baz*, *foo*. Matching is case insensitive by default. Prepending an element with (?-i) makes the matching case sensitive.
This option supports the wildcard `*`, which matches zero or more characters. Examples: `GET /foo/*/bar/*/baz*``, `*foo*`. Matching is case insensitive by default. Prepending an element with (?-i) makes the matching case sensitive.

[options="header"]
|============
Expand Down Expand Up @@ -1118,8 +1120,9 @@ When this setting is `true`, the agent also adds the header `elasticapm-tracepar
[[config-use-path-as-transaction-name]]
==== `UsePathAsTransactionName` (added[1.27.0])

If set to `true`,
transaction names of unsupported or partially-supported frameworks will be in the form of `$method $path` instead of just `$method unknown route`.
<<dynamic-configuration, image:./images/dynamic-config.svg[] >>

If set to `true`, transaction names of unsupported or partially-supported frameworks will be in the form of `$method $path` instead of just `$method unknown route`.

WARNING: If your URLs contain path parameters like `/user/$userId`,
you should be very careful when enabling this flag,
Expand Down Expand Up @@ -1412,12 +1415,12 @@ you must instead set the `LogLevel` for the internal APM logger under the `Loggi
| <<config-stack-trace-limit,`StackTraceLimit`>> | Yes | Stacktrace, Performance
| <<config-trace-context-ignore-sampled-false,`TraceContextIgnoreSampledFalse`>> | No | Core
| <<config-transaction-ignore-urls,`TransactionIgnoreUrls`>> | Yes | HTTP, Performance
| <<config-transaction-name-groups,`TransactionNameGroups`>> | No | HTTP
| <<config-transaction-name-groups,`TransactionNameGroups`>> | Yes | HTTP
| <<config-transaction-max-spans,`TransactionMaxSpans`>> | Yes | Core, Performance
| <<config-transaction-sample-rate,`TransactionSampleRate`>> | Yes | Core, Performance
| <<config-trace-continuation-strategy,`TraceContinuationStrategy`>> | Yes | HTTP, Performance
| <<config-use-elastic-apm-traceparent-header,`UseElasticTraceparentHeader`>> | No | HTTP
| <<config-use-path-as-transaction-name,`UsePathAsTransactionName`>> | No | HTTP
| <<config-use-path-as-transaction-name,`UsePathAsTransactionName`>> | Yes | HTTP
| <<config-use-windows-credentials,`UseWindowsCredentials`>> | No | Reporter
| <<config-verify-server-cert,`VerifyServerCert`>> | No | Reporter

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,8 @@ internal class CentralConfiguration : AbstractConfigurationReader, IConfiguratio
GetSimpleConfigurationValue(DynamicConfigurationOption.ExitSpanMinDuration, ParseExitSpanMinDuration);
TraceContinuationStrategy =
GetConfigurationValue(DynamicConfigurationOption.TraceContinuationStrategy, ParseTraceContinuationStrategy);
TransactionNameGroups = GetConfigurationValue(DynamicConfigurationOption.TransactionNameGroups, ParseTransactionNameGroups);
UsePathAsTransactionName = GetSimpleConfigurationValue(DynamicConfigurationOption.UsePathAsTransactionName, ParseUsePathAsTransactionName);
}

public string Description => $"Central configuration (ETag: `{ETag}')";
Expand Down Expand Up @@ -92,10 +94,14 @@ internal class CentralConfiguration : AbstractConfigurationReader, IConfiguratio

internal IReadOnlyList<WildcardMatcher> TransactionIgnoreUrls { get; private set; }

internal IReadOnlyCollection<WildcardMatcher> TransactionNameGroups { get; private set; }

internal int? TransactionMaxSpans { get; private set; }

internal double? TransactionSampleRate { get; private set; }

internal bool? UsePathAsTransactionName { get; private set; }

private CentralConfigurationKeyValue BuildKv(DynamicConfigurationOption option, string value) => new(option, value, Description);

private T GetConfigurationValue<T>(DynamicConfigurationOption option, Func<ConfigurationKeyValue, T> parser)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,8 +30,10 @@ internal enum DynamicConfigurationOption
StackTraceLimit = ConfigurationOption.StackTraceLimit,
TraceContinuationStrategy = ConfigurationOption.TraceContinuationStrategy,
TransactionIgnoreUrls = ConfigurationOption.TransactionIgnoreUrls,
TransactionNameGroups = ConfigurationOption.TransactionNameGroups,
TransactionMaxSpans = ConfigurationOption.TransactionMaxSpans,
TransactionSampleRate = ConfigurationOption.TransactionSampleRate,
UsePathAsTransactionName = ConfigurationOption.UsePathAsTransactionName
}

internal static class DynamicConfigurationExtensions
Expand Down Expand Up @@ -64,6 +66,8 @@ dynamicOption switch
TransactionIgnoreUrls => ConfigurationOption.TransactionIgnoreUrls,
TransactionMaxSpans => ConfigurationOption.TransactionMaxSpans,
TransactionSampleRate => ConfigurationOption.TransactionSampleRate,
TransactionNameGroups => ConfigurationOption.TransactionNameGroups,
UsePathAsTransactionName => ConfigurationOption.UsePathAsTransactionName,
_ => throw new ArgumentOutOfRangeException(nameof(dynamicOption), dynamicOption, null)
};

Expand All @@ -75,7 +79,7 @@ option switch
ConfigurationOption.CaptureHeaders => CaptureHeaders,
ConfigurationOption.ExitSpanMinDuration => ExitSpanMinDuration,
ConfigurationOption.IgnoreMessageQueues => IgnoreMessageQueues,
ConfigurationOption.LogLevel => DynamicConfigurationOption.LogLevel,
ConfigurationOption.LogLevel => LogLevel,
ConfigurationOption.Recording => Recording,
ConfigurationOption.SanitizeFieldNames => SanitizeFieldNames,
ConfigurationOption.SpanCompressionEnabled => SpanCompressionEnabled,
Expand All @@ -90,6 +94,8 @@ option switch
ConfigurationOption.TransactionIgnoreUrls => TransactionIgnoreUrls,
ConfigurationOption.TransactionMaxSpans => TransactionMaxSpans,
ConfigurationOption.TransactionSampleRate => TransactionSampleRate,
ConfigurationOption.TransactionNameGroups => TransactionNameGroups,
ConfigurationOption.UsePathAsTransactionName => UsePathAsTransactionName,
_ => null
};

Expand All @@ -101,7 +107,7 @@ dynamicOption switch
CaptureHeaders => "capture_headers",
ExitSpanMinDuration => "exit_span_min_duration",
IgnoreMessageQueues => "ignore_message_queues",
DynamicConfigurationOption.LogLevel => "log_level",
LogLevel => "log_level",
Recording => "recording",
SanitizeFieldNames => "sanitize_field_names",
SpanCompressionEnabled => "span_compression_enabled",
Expand All @@ -116,6 +122,8 @@ dynamicOption switch
TransactionIgnoreUrls => "transaction_ignore_urls",
TransactionMaxSpans => "transaction_max_spans",
TransactionSampleRate => "transaction_sample_rate",
TransactionNameGroups => "transaction_name_groups",
UsePathAsTransactionName => "use_path_as_transaction_name",
_ => throw new ArgumentOutOfRangeException(nameof(dynamicOption), dynamicOption, null)
};
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -118,15 +118,15 @@ internal RuntimeConfigurationSnapshot(IConfigurationReader mainConfiguration, Ce
_dynamicConfiguration?.TransactionIgnoreUrls ?? _mainConfiguration.TransactionIgnoreUrls;

public IReadOnlyCollection<WildcardMatcher> TransactionNameGroups =>
_mainConfiguration.TransactionNameGroups;
_dynamicConfiguration?.TransactionNameGroups ?? _mainConfiguration.TransactionNameGroups;

public int TransactionMaxSpans => _dynamicConfiguration?.TransactionMaxSpans ?? _mainConfiguration.TransactionMaxSpans;

public double TransactionSampleRate => _dynamicConfiguration?.TransactionSampleRate ?? _mainConfiguration.TransactionSampleRate;

public bool UseElasticTraceparentHeader => _mainConfiguration.UseElasticTraceparentHeader;

public bool UsePathAsTransactionName => _mainConfiguration.UsePathAsTransactionName;
public bool UsePathAsTransactionName => _dynamicConfiguration?.UsePathAsTransactionName ?? _mainConfiguration.UsePathAsTransactionName;

public bool VerifyServerCert => _mainConfiguration.VerifyServerCert;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -169,6 +169,8 @@ public void ParseHttpResponse_ShouldReturnEmptyConfigDelta_WhenResponseBodyIsEmp
configDelta.LogLevel.Should().BeNull();
configDelta.SpanFramesMinDurationInMilliseconds.Should().BeNull();
configDelta.StackTraceLimit.Should().BeNull();
configDelta.TransactionNameGroups.Should().BeNull();
configDelta.UsePathAsTransactionName.Should().BeNull();
}

[Fact]
Expand Down Expand Up @@ -307,6 +309,29 @@ public static IEnumerable<object[]> ConfigDeltaData
})
};
}

yield return new object[]
{
$"{{\"{DynamicConfigurationOption.UsePathAsTransactionName.ToJsonKey()}\": \"{true}\"}}",
new Action<CentralConfiguration>(cfg =>
{
cfg.UsePathAsTransactionName.Should()
.NotBeNull()
.And.Be(true);
})
};

var transactionNameGroups = "GET /customers/*, GET /orders/*";
yield return new object[]
{
$"{{\"{DynamicConfigurationOption.TransactionNameGroups.ToJsonKey()}\": \"{transactionNameGroups}\"}}",
new Action<CentralConfiguration>(cfg =>
{
cfg.TransactionNameGroups.Should()
.NotBeNull()
.And.HaveCount(2);
})
};
}
}

Expand Down

0 comments on commit 3e68281

Please sign in to comment.