diff --git a/src/DogStatsd.php b/src/DogStatsd.php index 590dcf4..2abb59b 100644 --- a/src/DogStatsd.php +++ b/src/DogStatsd.php @@ -247,6 +247,32 @@ private function resetTelemetry() $this->packets_sent = 0; $this->packets_dropped = 0; } + + /** + * Gets the origin detection fields to be appended to each metric. + * + * @param string|null $cardinality override cardinality to set. + * @returns string + */ + private function getFields($cardinality) + { + $cardinalityToUse = $this->validateCardinality($cardinality ?: $this->cardinality); + + $additionalFields = ""; + if ($this->externalData) { + $additionalFields .= "|e:{$this->externalData}"; + } + if ($cardinalityToUse) { + $additionalFields .= "|card:{$cardinalityToUse}"; + } + if ($this->containerID) { + $additionalFields .= "|c:{$this->containerID}"; + } + + return $additionalFields; + } + + /** * Reset the telemetry value to zero */ @@ -256,13 +282,17 @@ private function flushTelemetry() return ""; } - return "\ndatadog.dogstatsd.client.metrics:{$this->metrics_sent}|c{$this->telemetry_tags}" - . "\ndatadog.dogstatsd.client.events:{$this->events_sent}|c{$this->telemetry_tags}" - . "\ndatadog.dogstatsd.client.service_checks:{$this->service_checks_sent}|c{$this->telemetry_tags}" - . "\ndatadog.dogstatsd.client.bytes_sent:{$this->bytes_sent}|c{$this->telemetry_tags}" - . "\ndatadog.dogstatsd.client.bytes_dropped:{$this->bytes_dropped}|c{$this->telemetry_tags}" - . "\ndatadog.dogstatsd.client.packets_sent:{$this->packets_sent}|c{$this->telemetry_tags}" - . "\ndatadog.dogstatsd.client.packets_dropped:{$this->packets_dropped}|c{$this->telemetry_tags}"; + $additionalFields = $this->getFields(null); + + // phpcs:disable + return "\ndatadog.dogstatsd.client.metrics:{$this->metrics_sent}|c{$this->telemetry_tags}{$additionalFields}" + . "\ndatadog.dogstatsd.client.events:{$this->events_sent}|c{$this->telemetry_tags}{$additionalFields}" + . "\ndatadog.dogstatsd.client.service_checks:{$this->service_checks_sent}|c{$this->telemetry_tags}{$additionalFields}" + . "\ndatadog.dogstatsd.client.bytes_sent:{$this->bytes_sent}|c{$this->telemetry_tags}{$additionalFields}" + . "\ndatadog.dogstatsd.client.bytes_dropped:{$this->bytes_dropped}|c{$this->telemetry_tags}{$additionalFields}" + . "\ndatadog.dogstatsd.client.packets_sent:{$this->packets_sent}|c{$this->telemetry_tags}{$additionalFields}" + . "\ndatadog.dogstatsd.client.packets_dropped:{$this->packets_dropped}|c{$this->telemetry_tags}{$additionalFields}"; + // phpcs:enable } /** @@ -506,18 +536,12 @@ public function send($data, $sampleRate = 1.0, $tags = null, $cardinality = null return; } - $cardinalityToUse = $this->validateCardinality($cardinality ?: $this->cardinality); + $fields = $this->getFields($cardinality); foreach ($sampledData as $stat => $value) { $value .= $this->serializeTags($tags); - if ($this->externalData) { - $value .= "|e:{$this->externalData}"; - } - if ($cardinalityToUse) { - $value .= "|card:{$cardinalityToUse}"; - } - if ($this->containerID) { - $value .= "|c:{$this->containerID}"; + if ($fields) { + $value .= $fields; } $this->report("{$this->metricPrefix}$stat:$value"); } diff --git a/tests/UnitTests/DogStatsd/SocketsTest.php b/tests/UnitTests/DogStatsd/SocketsTest.php index afb003e..79ce558 100644 --- a/tests/UnitTests/DogStatsd/SocketsTest.php +++ b/tests/UnitTests/DogStatsd/SocketsTest.php @@ -141,6 +141,9 @@ public function assertSameWithTelemetry($expected, $actual, $message="", $params $packets_sent = $this->get_default($params["packets_sent"], 0); $packets_dropped = $this->get_default($params["packets_dropped"], 0); $transport_type = $this->get_default($params["transport"], "udp"); + $external_env = $this->get_default($params["external_env"], null); + $container_id = $this->get_default($params["container_id"], null); + $cardinality = $this->get_default($params["cardinality"], null); $version = DogStatsd::$version; $tags = "client:php,client_version:{$version},client_transport:{$transport_type}"; @@ -150,13 +153,24 @@ public function assertSameWithTelemetry($expected, $actual, $message="", $params $tags = $extra_tags.",".$tags; } - $telemetry = "\ndatadog.dogstatsd.client.metrics:{$metrics_sent}|c|#{$tags}" - . "\ndatadog.dogstatsd.client.events:{$events_sent}|c|#{$tags}" - . "\ndatadog.dogstatsd.client.service_checks:{$service_checks_sent}|c|#{$tags}" - . "\ndatadog.dogstatsd.client.bytes_sent:{$bytes_sent}|c|#{$tags}" - . "\ndatadog.dogstatsd.client.bytes_dropped:{$bytes_dropped}|c|#{$tags}" - . "\ndatadog.dogstatsd.client.packets_sent:{$packets_sent}|c|#{$tags}" - . "\ndatadog.dogstatsd.client.packets_dropped:{$packets_dropped}|c|#{$tags}"; + $additionalFields = ""; + if ($external_env) { + $additionalFields .= "|e:{$external_env}"; + } + if ($cardinality) { + $additionalFields .= "|card:{$cardinality}"; + } + if ($container_id) { + $additionalFields .= "|c:{$container_id}"; + } + + $telemetry = "\ndatadog.dogstatsd.client.metrics:{$metrics_sent}|c|#{$tags}{$additionalFields}" + . "\ndatadog.dogstatsd.client.events:{$events_sent}|c|#{$tags}{$additionalFields}" + . "\ndatadog.dogstatsd.client.service_checks:{$service_checks_sent}|c|#{$tags}{$additionalFields}" + . "\ndatadog.dogstatsd.client.bytes_sent:{$bytes_sent}|c|#{$tags}{$additionalFields}" + . "\ndatadog.dogstatsd.client.bytes_dropped:{$bytes_dropped}|c|#{$tags}{$additionalFields}" + . "\ndatadog.dogstatsd.client.packets_sent:{$packets_sent}|c|#{$tags}{$additionalFields}" + . "\ndatadog.dogstatsd.client.packets_dropped:{$packets_dropped}|c|#{$tags}{$additionalFields}"; $this->assertSame( $expected.$telemetry, @@ -1570,7 +1584,11 @@ public function testExternalEnv() $this->assertSameWithTelemetry( $expectedUdpMessage, $argsPassedToSocketSendTo[1], - "" + "", + array( + "external_env" => "cn-SomeKindOfContainerName", + "container_id" => "container" + ) ); } @@ -1595,7 +1613,11 @@ public function testExternalEnvInvalidCharacters() $this->assertSameWithTelemetry( $expectedUdpMessage, $argsPassedToSocketSendTo[1], - "" + "", + array( + "external_env" => "it-false,cn-nginx-webserver,pu-75a2b6d5-3949-4afb-ad0d-92ff0674e759", + "container_id" => "container" + ) ); } @@ -1618,7 +1640,11 @@ public function testExternalEnvWithTags() $this->assertSameWithTelemetry( $expectedUdpMessage, $argsPassedToSocketSendTo[1], - "" + "", + array( + "external_env" => "it-false,cn-nginx-webserver,pu-75a2b6d5-3949-4afb-ad0d-92ff0674e759", + "container_id" => "container" + ) ); } @@ -1663,7 +1689,10 @@ public function testExternalEnvDisabledOriginDetectionContainerID() $this->assertSameWithTelemetry( $expectedUdpMessage, $argsPassedToSocketSendTo[1], - "" + "", + array( + "container_id" => "container" + ) ); } @@ -1736,7 +1765,10 @@ public function testGlobalCardinality() $this->assertSameWithTelemetry( $expectedUdpMessage, $argsPassedToSocketSendTo[1], - "" + "", + array( + "cardinality" => "orchestrator" + ) ); } @@ -1758,7 +1790,10 @@ public function testEnvVarCardinality() $this->assertSameWithTelemetry( $expectedUdpMessage, $argsPassedToSocketSendTo[1], - "" + "", + array( + "cardinality" => "high" + ) ); }