메트릭 제출: DogStatsD

StatsD는 메트릭만 허용하지만 DogStatsD는 세 가지 주요 Datadog 데이터 유형인 메트릭, 이벤트, 서비스 검사 모두를 허용합니다. 이 섹션에서는 메트릭의 일반적인 사용 사례를 메트릭 유형별로 나누어 보여주고, DogStatsD와 관련된 샘플링 비율메트릭 태깅 옵션에 대해 소개합니다.

COUNT, GAUGESET 메트릭 유형은 StatsD 사용자에게 익숙합니다. StatsD의 TIMER는 DogStatsD에서 HISTOGRAM의 하위 집합입니다. 또한 DogStatsD를 사용하여 HISTOGRAMDISTRIBUTION 메트릭 유형을 제출할 수 있습니다.

참고: 사용된 제출 방법에 따라 Datadog 내에 저장된 실제 메트릭 유형은 제출 메트릭 유형과 다를 수 있습니다. DogStatsD를 통해 RATE 메트릭을 얻으려면 COUNT 또는 HISTOGRAM 메트릭을 제출하면 됩니다. COUNT 메트릭 값과 <HISTOGRAM>.count 값은 StatsD 플러시 기간 동안의 메트릭 값 변화량을 시간 기준으로 정규화한 값입니다.

함수

DogStatsD 설치 후 메트릭 유형에 따라 Datadog에 메트릭을 제출하는 데 다음 함수를 사용할 수 있습니다. 함수는 다음 공유 파라미터를 갖습니다.

| 파라미터 | 유형 | 필수 | 설명 | ||||| | <METRIC_NAME> | String | 예 | 제출할 메트릭의 이름입니다. | | <METRIC_VALUE> | Double | 예 | 메트릭과 관련된 값입니다. | | <SAMPLE_RATE> | Double | 아니요 | 메트릭에 적용할 샘플 비율입니다. 0(모든 것이 샘플링되므로 아무것도 전송되지 않음)과 1(샘플 없음) 사이의 값을 사용합니다. 자세한 내용은 샘플 비율 섹션을 참조하세요. | | <TAGS> | 문자열 목록 | 아니요 | 메트릭에 적용할 태그 목록입니다. 자세한 내용은 메트릭 태깅 섹션을 참조하세요. | | <CARDINALITY> | Enum | No | 이 메트릭에 할당할 태그의 카디널리티입니다. |

COUNT

increment(<METRIC_NAME>, <SAMPLE_RATE>, <TAGS>, <CARDINALITY> )
COUNT 메트릭을 증가시키는 데 사용됩니다. Datadog에서 RATE 유형으로 저장됩니다. 저장된 시계열의 각 값은 StatsD 플러시 기간 동안의 메트릭 값 변화량을 시간 기준으로 정규화한 값입니다.
decrement(<METRIC_NAME>, <SAMPLE_RATE>, <TAGS>, <CARDINALITY>)
COUNT 메트릭을 감소시키는 데 사용됩니다. Datadog에서 RATE 유형으로 저장됩니다. 저장된 시계열의 각 값은 StatsD 플러시 기간 동안의 메트릭 값 변화량을 시간 기준으로 정규화한 값입니다.
count(<METRIC_NAME>, <METRIC_VALUE>, <SAMPLE_RATE>, <TAGS>, <CARDINALITY>)
임의의 Value에서 COUNT 메트릭을 증가시키는 데 사용됩니다. Datadog에서 RATE 유형으로 저장됩니다. 저장된 시계열의 각 값은 StatsD 플러시 기간 동안의 메트릭 값 변화량을 시간 기준으로 정규화한 값입니다.

참고: COUNT 유형 메트릭은 초당 단위를 보고하기 위해 플러시 간격 동안 정규화되므로 Datadog 내에서 십진수 값을 표시할 수 있습니다.

코드 예시

RATE 메트릭으로 저장된 COUNT 메트릭을 Datadog에 전송합니다. COUNT 유형에 대한 자세한 내용은 메트릭 유형 설명서를 참조하세요.

다음 코드를 실행하여 Datadog에 DogStatsD COUNT 메트릭을 제출합니다. 더 이상 필요하지 않을 때 클라이언트를 flush/close하는 것을 잊지 마세요.

from datadog import initialize, statsd
import time

options = {
    'statsd_host':'127.0.0.1',
    'statsd_port':8125
}

initialize(**options)

while(1):
  statsd.increment('example_metric.increment', tags=["environment:dev"])
  statsd.decrement('example_metric.decrement', tags=["environment:dev"])
  time.sleep(10)

참고: statsd.count는 Python에서 지원되지 않습니다.

require 'datadog/statsd'

statsd = Datadog::Statsd.new('localhost', 8125, tags: ['environment:dev'])

while true do
    statsd.increment('example_metric.increment')
    statsd.increment('example_metric.increment', tags: ['another:tag'])
    statsd.decrement('example_metric.decrement')
    statsd.count('example_metric.count', 2)
    sleep 10
end
package main

import (
	"log"
	"time"

	"github.com/DataDog/datadog-go/v5/statsd"
)

func main() {
	statsd, err := statsd.New("127.0.0.1:8125")
	if err != nil {
		log.Fatal(err)
	}
	for true {

		statsd.Incr("example_metric.increment", []string{"environment:dev"}, 1)
		statsd.Decr("example_metric.decrement", []string{"environment:dev"}, 1)
		statsd.Count("example_metric.count", 2, []string{"environment:dev"}, 1)
		time.Sleep(10 * time.Second)
	}
}
import com.timgroup.statsd.NonBlockingStatsDClientBuilder;
import com.timgroup.statsd.StatsDClient;
import java.util.Random;

public class DogStatsdClient {

    public static void main(String[] args) throws Exception {

        StatsDClient Statsd = new NonBlockingStatsDClientBuilder()
            .prefix("statsd")
            .hostname("localhost")
            .port(8125)
            .build();
        while (true) {
            Statsd.incrementCounter("example_metric.increment", new String[]{"environment:dev"});
            Statsd.decrementCounter("example_metric.decrement", new String[]{"environment:dev"});
            Statsd.count("example_metric.count", 2, new String[]{"environment:dev"});
            Thread.sleep(100000);
        }
    }
}
using StatsdClient;
using System;

public class DogStatsdClient
{
    public static void Main()
    {
        var dogstatsdConfig = new StatsdConfig
        {
            StatsdServerName = "127.0.0.1",
            StatsdPort = 8125,
        };

        using (var dogStatsdService = new DogStatsdService())
        {
            if (!dogStatsdService.Configure(dogstatsdConfig))
                throw new InvalidOperationException("Cannot initialize DogstatsD. Set optionalExceptionHandler argument in the `Configure` method for more information.");
            var random = new Random(0);

            while (true)
            {
                dogStatsdService.Increment("example_metric.increment", tags: new[] {"environment:dev"}, cardinality: Cardinality.Low);
                dogStatsdService.Decrement("example_metric.decrement", tags: new[] {"environment:dev"}, cardinality: Cardinality.High);
                dogStatsdService.Counter("example_metric.count", 2, tags: new[] {"environment:dev"});
                System.Threading.Thread.Sleep(random.Next(100000));
            }
        }
    }
}
<?php

require __DIR__ . '/vendor/autoload.php';

use DataDog\DogStatsd;

$statsd = new DogStatsd(
    array('host' => '127.0.0.1',
          'port' => 8125,
     )
  );

while (TRUE) {
    $statsd->increment('example_metric.increment', 1, array('environment'=>'dev'), 'low');
    $statsd->decrement('example_metric.decrement', 1, array('environment'=>'dev'), 'high');
    sleep(10);
}
const tracer = require('dd-trace');
tracer.init();

tracer.dogstatsd.increment('example_metric.increment', 1, { environment: 'dev' });
tracer.dogstatsd.decrement('example_metric.decrement', 1, { environment: 'dev' });

위의 코드를 실행하면 Datadog에서 메트릭 데이터를 그래프로 표시할 수 있습니다.

증가/감소

값은 COUNT로 제출되므로 Datadog에서 RATE로 저장됩니다. Datadog 내에서 원시 개수를 얻으려면 누적 합계 또는 적분 함수와 같은 계열에 함수를 적용합니다.

누적 합계를 사용한 증가/감소

GAUGE

gauge(<METRIC_NAME>, <METRIC_VALUE>, <SAMPLE_RATE>, <TAGS>, <CARDINALITY>)
Datadog에서 GAUGE 유형으로 저장됩니다. 저장된 시계열의 각 값은 StatsD 플러시 기간 동안 메트릭에 대해 제출된 마지막 게이지 값입니다.

코드 예시

GAUGE 메트릭으로 저장된 GAUGE 메트릭을 Datadog에 전송합니다. GAUGE 유형에 대한 자세한 내용은 메트릭 유형 설명서를 참조하세요.

다음 코드를 실행하여 DogStatsD GAUGE 메트릭을 Datadog에 제출합니다. 더 이상 필요하지 않을 때 클라이언트를 flush/close하는 것을 잊지 마세요.

참고: 메트릭 제출 호출은 비동기식입니다. 메트릭을 제출하려면 프로그램이 종료되기 전에 flush를 호출하세요.

from datadog import initialize, statsd
import time

options = {
    'statsd_host':'127.0.0.1',
    'statsd_port':8125
}

initialize(**options)

i = 0

while(1):
  i += 1
  statsd.gauge('example_metric.gauge', i, tags=["environment:dev"], cardinality="low")
  time.sleep(10)
require 'datadog/statsd'

statsd = Datadog::Statsd.new('localhost', 8125)

i = 0

while true do
    i += 1
    statsd.gauge('example_metric.gauge', i, tags: ['environment:dev'], cardinality: 'low')
    sleep 10
end
package main

import (
	"log"
	"time"

	"github.com/DataDog/datadog-go/v5/statsd"
)

func main() {
	statsd, err := statsd.New("127.0.0.1:8125")
	if err != nil {
		log.Fatal(err)
	}
	var i float64
	for true {
		i += 1
		statsd.Gauge("example_metric.gauge", i, []string{"environment:dev"}, 1, CardinalityHigh)
		time.Sleep(10 * time.Second)
	}
}
import com.timgroup.statsd.NonBlockingStatsDClientBuilder;
import com.timgroup.statsd.StatsDClient;
import java.util.Random;

public class DogStatsdClient {

    public static void main(String[] args) throws Exception {

        StatsDClient Statsd = new NonBlockingStatsDClientBuilder()
            .prefix("statsd").
            .hostname("localhost")
            .port(8125)
            .build();
        for (int i = 0; true; i++) {
            Statsd.recordGaugeValue("example_metric.gauge", i, new String[]{"environment:dev"});
            Thread.sleep(10000);
        }
    }
}
using StatsdClient;
using System;

public class DogStatsdClient
{
    public static void Main()
    {
        var dogstatsdConfig = new StatsdConfig
        {
            StatsdServerName = "127.0.0.1",
            StatsdPort = 8125,
        };

        using (var dogStatsdService = new DogStatsdService())
        {
            if (!dogStatsdService.Configure(dogstatsdConfig))
                throw new InvalidOperationException("Cannot initialize DogstatsD. Set optionalExceptionHandler argument in the `Configure` method for more information.");
            var random = new Random(0);

            for (int i = 0; true; i++)
            {
                dogStatsdService.Gauge("example_metric.gauge", i, tags: new[] {"environment:dev"}, cardinality: Cardinality.High);
                System.Threading.Thread.Sleep(100000);
            }
        }
    }
}
<?php

require __DIR__ . '/vendor/autoload.php';

use DataDog\DogStatsd;

$statsd = new DogStatsd(
    array('host' => '127.0.0.1',
          'port' => 8125,
     )
  );

$i = 0;
while (TRUE) {
    $i++;
    $statsd->gauge('example_metric.gauge', $i, array('environment'=>'dev'), 'low');
    sleep(10);
}
const tracer = require('dd-trace');
tracer.init();

let i = 0;
while(true) {
  i++;
  tracer.dogstatsd.gauge('example_metric.gauge', i, { environment: 'dev' });
}

위의 코드를 실행하면 Datadog에서 메트릭 데이터를 그래프로 표시할 수 있습니다.

게이지

SET

set(<METRIC_NAME>, <METRIC_VALUE>, <SAMPLE_RATE>, <TAGS>, <CARDINALITY>)
Datadog에서 GAUGE 유형으로 저장됩니다. 저장된 시계열의 각 값은 플러시 기간 동안 메트릭에 대해 StatsD에 제출된 고유 값의 수입니다.

코드 예시

GAUGE 메트릭으로 저장된 SET 메트릭을 Datadog에 전송합니다.

다음 코드를 실행하여 DogStatsD SET 메트릭을 Datadog에 제출합니다. 더 이상 필요하지 않을 때 클라이언트를 flush/close하는 것을 잊지 마세요.

from datadog import initialize, statsd
import time
import random

options = {
    'statsd_host':'127.0.0.1',
    'statsd_port':8125
}

initialize(**options)
i = 0
while(1):
  i += 1
  statsd.set('example_metric.set', i, tags=["environment:dev"])
  time.sleep(random.randint(0, 10))
require 'datadog/statsd'

statsd = Datadog::Statsd.new('localhost', 8125)

i = 0
while true do
    i += 1
    statsd.set('example_metric.gauge', i, tags: ['environment:dev'])
    sleep rand 10
end
package main

import (
	"fmt"
	"log"
	"math/rand"
	"time"

	"github.com/DataDog/datadog-go/v5/statsd"
)

func main() {
	statsd, err := statsd.New("127.0.0.1:8125")
	if err != nil {
		log.Fatal(err)
	}
	var i float64
	for true {
		i += 1
		statsd.Set("example_metric.set", fmt.Sprintf("%f", i), []string{"environment:dev"}, 1)
		time.Sleep(time.Duration(rand.Intn(10)) * time.Second)
	}
}
import com.timgroup.statsd.NonBlockingStatsDClientBuilder;
import com.timgroup.statsd.StatsDClient;
import java.util.Random;

public class DogStatsdClient {

    public static void main(String[] args) throws Exception {

        StatsDClient Statsd = new NonBlockingStatsDClientBuilder()
            .prefix("statsd").
            .hostname("localhost")
            .port(8125)
            .build();
        for (int i = 0; true; i++) {
            Statsd.recordSetValue("example_metric.set", i, new String[]{"environment:dev"});
            Thread.sleep(random.NextInt(10000));
        }
    }
}
using StatsdClient;
using System;

public class DogStatsdClient
{
    public static void Main()
    {
        var dogstatsdConfig = new StatsdConfig
        {
            StatsdServerName = "127.0.0.1",
            StatsdPort = 8125,
        };

        using (var dogStatsdService = new DogStatsdService())
        {
            if (!dogStatsdService.Configure(dogstatsdConfig))
                throw new InvalidOperationException("Cannot initialize DogstatsD. Set optionalExceptionHandler argument in the `Configure` method for more information.");
            var random = new Random(0);

            for (int i = 0; true; i++)
            {
                dogStatsdService.Set("example_metric.set", i, tags: new[] {"environment:dev"});
                System.Threading.Thread.Sleep(random.Next(100000));
            }
        }
    }
}
<?php

require __DIR__ . '/vendor/autoload.php';

use DataDog\DogStatsd;

$statsd = new DogStatsd(
    array('host' => '127.0.0.1',
          'port' => 8125,
     )
  );

$i = 0;

while (TRUE) {
    $i++;
    $statsd->set('example_metric.set', $i, 1, array('environment'=>'dev'), 'low');
    sleep(rand(0, 10));
}

위의 코드를 실행하면 Datadog에서 메트릭 데이터를 그래프로 표시할 수 있습니다.

설정

HISTOGRAM

histogram(<METRIC_NAME>, <METRIC_VALUE>, <SAMPLE_RATE>, <TAGS>, <CARDINALITY>)
여러 메트릭이 제출되므로 저장된 메트릭 유형(GAUGE, RATE)은 메트릭에 따라 다릅니다. 자세한 내용은 HISTOGRAM 메트릭 유형 설명서를 참조하세요.

구성

  • histogram_aggregates 파라미터를 사용하여 Datadog로 전송할 집계를 datadog.yaml 구성 파일에 구성합니다. 기본적으로 max, median, avg, 및 count 집계만 전송됩니다.
  • Datadog로 전송할 백분위수 집계를 histogram_percentiles 파라미터를 사용하여 datadog.yaml 구성 파일에서 구성합니다. 기본적으로 오직 95pc 백분위수만 전송됩니다.

코드 예시

HISTOGRAM 메트릭 유형은 DogStatsD에만 해당합니다. GAUGERATE 메트릭으로 저장된 HISTOGRAM 메트릭을 Datadog에 전송합니다. HISTOGRAM 유형에 대한 자세한 내용은 메트릭 유형 설명서를 참조하세요.

다음 코드를 실행하여 DogStatsD HISTOGRAM 메트릭을 Datadog에 제출합니다. 더 이상 필요하지 않을 때 클라이언트를 flush/close하는 것을 잊지 마세요.

from datadog import initialize, statsd
import time
import random

options = {
    'statsd_host':'127.0.0.1',
    'statsd_port':8125
}

initialize(**options)

while(1):
  statsd.histogram('example_metric.histogram', random.randint(0, 20), tags=["environment:dev"])
  time.sleep(2)
require 'datadog/statsd'

statsd = Datadog::Statsd.new('localhost', 8125)

while true do
    statsd.histogram('example_metric.histogram', rand 20, tags: ['environment:dev'])
    sleep 2
end
package main

import (
	"log"
	"math/rand"
	"time"

	"github.com/DataDog/datadog-go/v5/statsd"
)

func main() {
	statsd, err := statsd.New("127.0.0.1:8125")
	if err != nil {
		log.Fatal(err)
	}

	for true {
		statsd.Histogram("example_metric.histogram", float64(rand.Intn(20)), []string{"environment:dev"}, 1)
		time.Sleep(2 * time.Second)
	}
}
import com.timgroup.statsd.NonBlockingStatsDClientBuilder;
import com.timgroup.statsd.StatsDClient;
import java.util.Random;

public class DogStatsdClient {

    public static void main(String[] args) throws Exception {

        StatsDClient Statsd = new NonBlockingStatsDClientBuilder()
            .prefix("statsd").
            .hostname("localhost")
            .port(8125)
            .build();
        while (true) {
            Statsd.recordHistogramValue("example_metric.histogram", new Random().nextInt(20), new String[]{"environment:dev"});
            Thread.sleep(2000);
        }
    }
}
using StatsdClient;
using System;

public class DogStatsdClient
{
    public static void Main()
    {
        var dogstatsdConfig = new StatsdConfig
        {
            StatsdServerName = "127.0.0.1",
            StatsdPort = 8125,
        };

        using (var dogStatsdService = new DogStatsdService())
        {
            if (!dogStatsdService.Configure(dogstatsdConfig))
                throw new InvalidOperationException("Cannot initialize DogstatsD. Set optionalExceptionHandler argument in the `Configure` method for more information.");
            var random = new Random(0);

            while (true)
            {
                dogStatsdService.Histogram("example_metric.histogram", random.Next(20), tags: new[] {"environment:dev"}, Cardinality: Cardinality.High);
                System.Threading.Thread.Sleep(2000);
            }
        }
    }
}
<?php

require __DIR__ . '/vendor/autoload.php';

use DataDog\DogStatsd;

$statsd = new DogStatsd(
    array('host' => '127.0.0.1',
          'port' => 8125,
     )
  );

while (TRUE) {
    $statsd->histogram('example_metric.histogram', rand(0, 20), 1, array('environment'=>'dev'), 'low');
    sleep(2);
}

위의 계측은 다음 메트릭을 생성합니다.

| 메트릭 | 설명 | ||| | example_metric.histogram.count | 이 메트릭이 샘플링된 횟수 | | example_metric.histogram.avg | 샘플링된 값의 평균 | | example_metric.histogram.median | 샘플링된 값의 중앙값 | | example_metric.histogram.max | 샘플링된 값의 최대값 | | example_metric.histogram.95percentile | 샘플링된 값의 95번째 백분위수 |

위의 코드를 실행하면 Datadog에서 메트릭 데이터를 그래프로 표시할 수 있습니다.

Histogram

TIMER

DogStatsD의 TIMER 메트릭 유형은 HISTOGRAM 메트릭 유형의 구현입니다(표준 StatsD의 타이머와 혼동하지 마세요). 타이밍 데이터(예: 코드 섹션이 실행되는 데 걸리는 시간)만 측정합니다.

timed(<METRIC_NAME>, <METRIC_VALUE>, <SAMPLE_RATE>, <TAGS>, <CARDINALITY>)
여러 메트릭이 제출되므로 저장된 메트릭 유형(GAUGE, RATE)은 메트릭에 따라 다릅니다. 자세한 내용은 HISTOGRAM 메트릭 유형 설명서를 참조하세요.
구성

TIMER의 경우, HISTOGRAM 구성 규칙이 적용됩니다.

코드 예시

GAUGERATE 메트릭으로 저장된 TIMER 메트릭을 Datadog에 전송합니다. HISTOGRAM 유형에 대한 자세한 내용은 메트릭 유형 설명서를 참조하세요. 더 이상 필요하지 않을 때 클라이언트를 flush/close하는 것을 잊지 마세요.

Python에서 타이머는 데코레이터를 사용하여 생성됩니다.

from datadog import initialize, statsd
import time
import random

options = {
    'statsd_host':'127.0.0.1',
    'statsd_port':8125
}

initialize(**options)

@statsd.timed('example_metric.timer', tags=["environment:dev,function:my_function"])
def my_function():
  time.sleep(random.randint(0, 10))

while(1):
  my_function()

또는 컨텍스트 관리자가 사용됩니다.

from datadog import statsd
import time
import random

def my_function():

  # First some stuff you don't want to time
  sleep(1)

  # Now start the timer
  with statsd.timed('example_metric.timer', tags=["environment:dev"]):
    # do something to be measured
    sleep(random.randint(0, 10))

while(1):
  my_function()
<?php

require __DIR__ . '/vendor/autoload.php';

use DataDog\DogStatsd;

$statsd = new DogStatsd(
    array('host' => '127.0.0.1',
          'port' => 8125,
     )
  );

function runfunction() {
    sleep(rand(0, 20));
}

while (TRUE) {
  $start_time = microtime(TRUE);
  runfunction();
  $statsd->microtiming('example_metric.timer', microtime(TRUE) - $start_time);
}

DogStatsD는 타이머 메트릭 데이터를 수신하면서, 렌더링 시간의 통계적 분포를 계산하고 다음 메트릭을 Datadog에 전송합니다.

| 메트릭 | 설명 | ||| | example_metric.timer.count | 이 메트릭이 샘플링된 횟수 | | example_metric.timer.avg | 샘플링된 값의 평균 시간 | | example_metric.timer.median | 샘플링된 값의 중앙값 | | example_metric.timer.max | 샘플링된 값의 최대값 | | example_metric.timer.95percentile | 샘플링된 값의 95번째 백분위수 |

DogStatsD는 TIMERHISTOGRAM 메트릭으로 처리합니다. TIMER 메트릭 유형을 사용하든 HISTOGRAM 메트릭 유형을 사용하든, 동일한 데이터를 Datadog에 전송합니다. 위의 코드를 실행하면 Datadog에서 메트릭 데이터를 그래프로 표시할 수 있습니다.

타이머

DISTRIBUTION

distribution(<METRIC_NAME>, <METRIC_VALUE>, <TAGS>, <CARDINALITY>)
Datadog에서 DISTRIBUTION 유형으로 저장됩니다. 자세한 내용은 Distribution 설명서를 참조하세요.

코드 예시

DISTRIBUTION 메트릭 유형은 DogStatsD에만 해당합니다. DISTRIBUTION 메트릭으로 저장된 DISTRIBUTION 메트릭을 Datadog에 전송합니다. DISTRIBUTION 유형에 대한 자세한 내용은 메트릭 유형 설명서를 참조하세요.

다음 코드를 실행하여 DogStatsD DISTRIBUTION 메트릭을 Datadog에 제출합니다. 더 이상 필요하지 않을 때 클라이언트를 flush/close하는 것을 잊지 마세요.

from datadog import initialize, statsd
import time
import random

options = {
    'statsd_host':'127.0.0.1',
    'statsd_port':8125
}

initialize(**options)

while(1):
  statsd.distribution('example_metric.distribution', random.randint(0, 20), tags=["environment:dev"])
  time.sleep(2)
require 'datadog/statsd'

statsd = Datadog::Statsd.new('localhost', 8125)

while true do
    statsd.distribution('example_metric.distribution', rand 20, tags: ['environment:dev'])
    sleep 2
end
package main

import (
	"log"
	"math/rand"
	"time"

	"github.com/DataDog/datadog-go/v5/statsd"
)

func main() {
	statsd, err := statsd.New("127.0.0.1:8125")
	if err != nil {
		log.Fatal(err)
	}

	for true {
		statsd.Distribution("example_metric.distribution", float64(rand.Intn(20)), []string{"environment:dev"}, 1)
		time.Sleep(2 * time.Second)
	}
}
import com.timgroup.statsd.NonBlockingStatsDClientBuilder;
import com.timgroup.statsd.StatsDClient;
import java.util.Random;

public class DogStatsdClient {

    public static void main(String[] args) throws Exception {

        StatsDClient Statsd = new NonBlockingStatsDClientBuilder()
            .prefix("statsd").
            .hostname("localhost")
            .port(8125)
            .build();
        while (true) {
            Statsd.recordDistributionValue("example_metric.distribution", new Random().nextInt(20), new String[]{"environment:dev"});
            Thread.sleep(2000);
        }
    }
}
using StatsdClient;
using System;

public class DogStatsdClient
{
    public static void Main()
    {
        var dogstatsdConfig = new StatsdConfig
        {
            StatsdServerName = "127.0.0.1",
            StatsdPort = 8125,
        };

        using (var dogStatsdService = new DogStatsdService())
        {
            if (!dogStatsdService.Configure(dogstatsdConfig))
                throw new InvalidOperationException("Cannot initialize DogstatsD. Set optionalExceptionHandler argument in the `Configure` method for more information.");
            var random = new Random(0);

            while (true)
            {
                dogStatsdService.Distribution("example_metric.distribution", random.Next(20), tags: new[] {"environment:dev"});
                System.Threading.Thread.Sleep(2000);
            }
        }
    }
}
<?php

require __DIR__ . '/vendor/autoload.php';

use DataDog\DogStatsd;

$statsd = new DogStatsd(
    array('host' => '127.0.0.1',
          'port' => 8125,
     )
  );

while (TRUE) {
    $statsd->distribution('example_metric.distribution', rand(0, 20), 1, array('environment'=>'dev'), 'high');
    sleep(2);
}
const tracer = require('dd-trace');
tracer.init();

while(true) {
  tracer.dogstatsd.distribution('example_metric.distribution', Math.random() * 20, { environment: 'dev' });
  await new Promise(r => setTimeout(r, 2000));
}

위의 계측은 sum, count, average, minimum, maximum, 50th percentile (median), 75th percentile, 90th percentile, 95th percentile99th percentile을 계산합니다. Distribution은 업로드된 파일의 크기나 교실 시험 점수와 같이 다양한 값의 분포 측정에 사용할 수 있습니다.

메트릭 제출 옵션

샘플 속도

UDP 패킷 전송에 따른 오버헤드가 성능 집약적인 일부 코드 경로에서는 너무 클 수 있으므로, DogStatsD 클라이언트는 샘플링(메트릭을 일정 비율로만 전송하는 방식)을 지원합니다. 이는 많은 메트릭을 샘플링하는 경우나, DogStatsD 클라이언트가 DogStatsD 서버와 동일한 호스트에 있지 않은 경우 특히 유용합니다. 하지만 트래픽은 줄어드는 반면 일부 정확도와 세밀도는 감소합니다.

샘플 속도가 1인 경우 메트릭을 100% 전송하는 반면, 샘플 속도가 0인 경우 메트릭을 0% 전송합니다.

메트릭을 Datadog로 보내기 전에 DogStatsD는 <SAMPLE_RATE>를 사용하여 메트릭 유형에 따라 메트릭 값을 수정합니다(샘플링 없이 값을 추정하기 위해).

| 메트릭 유형 | 샘플 속도 보정 | ||| | COUNT | 수신된 값에 (1/<SAMPLE_RATE>)를 곱합니다. 수신된 하나의 데이터포인트에 대해 1/<SAMPLE_RATE>가 실제로 동일한 값으로 샘플링되었다고 가정하는 것이 합리적입니다. | | GAUGE | 보정 없음. 수신된 값은 그대로 유지됩니다. | | SET | 보정 없음. 수신된 값은 그대로 유지됩니다. | | HISTOGRAM | histogram.count 통계는 COUNT 메트릭이며 위에 설명된 보정을 적용받습니다. 다른 통계는 게이지 메트릭이며 “보정"하지 않습니다. | | DISTRIBUTION | 수신된 값은 (1/<SAMPLE_RATE>)번 카운트됩니다. 수신된 하나의 데이터포인트에 대해 1/<SAMPLE_RATE>가 실제로 동일한 값으로 샘플링되었다고 가정하는 것이 합리적입니다. |

코드 예시

다음 코드는 포인트를 절반만 전송합니다.

statsd.increment('loop.count', sample_rate=0.5)
statsd.increment('loop.count', :sample_rate => 0.5)
statsd.Incr("example_metric.increment", []string{}, 0.5)
Statsd.incrementCounter("example_metric.increment", sampleRate=0.5);
dogStatsdService.Increment("example_metric.increment", sampleRate: 0.5);
<? php
$statsd->increment('example_metric.increment', $sampleRate->0.5);

메트릭 태깅

tags 파라미터를 사용해 DogStatsD에 전송할 메트릭에 태그를 추가합니다.

코드 예시

다음 코드는 example_metric.increment 메트릭에 environment:devaccount:local 태그만 추가합니다.

statsd.increment('example_metric.increment', tags=["environment:dev","account:local"])
statsd.increment('example_metric.increment', tags: ['environment:dev','account:local'])
statsd.Incr("example_metric.increment", []string{"environment:dev","account:local"}, 1)
Statsd.incrementCounter("example_metric.increment", new String[]{"environment:dev","account:local"});
dogStatsdService.Increment("example_metric.increment", tags: new[] {"environment:dev","account:local"})

tags 인수는 문자열

$statsd->increment('example_metric.increment', 1.0, "environment:dev,account:local");

또는 배열로 전달할 수 있습니다.

<?php
$statsd->increment('example_metric.increment', 1.0, array('environment' => 'dev', 'account' => 'local'));
tracer.dogstatsd.increment('example_metric.increment', 1, { environment: 'dev', account: 'local' });

호스트 태그

호스트 태그는 메트릭을 집계하는 Datadog Agent에 의해 자동으로 할당됩니다. 호스트 태그가 Agent 호스트 이름과 일치하지 않는 메트릭은 원래 호스트와의 연결이 끊어집니다. 제출된 호스트 태그는 Agent에서 수집하거나 구성한 호스트 이름을 재정의합니다.

참고 자료