본문 바로가기

APM

데이터독 APM(커스텀 스팬 및 APM/LOG 메시지 변경)

Datadog APM은 dd-trace라는 lib를 통해 데이터독과 인티그레이션 된 프레임워크나 모듈들을 모니터링 해준다.

https://docs.datadoghq.com/tracing/trace_collection/compatibility/java

APM를 설치하고 테스트 해보면 아래와 같이 HTTP API 호출에 대한 정보를 볼 수 있다.

하나의 요청은 Trace로 명시되고, Trace를 선택하면 Flame Graph라고 불리는 화면을 볼 수 있다.

Flame Graph 내에는 Trace 내에서 호출된 다양한 요청(Span)들을 볼 수 있다. 

https 관련 모듈은 dd-trace(node.js)에서 호환 되어 있기 때문에 해당 exception을 바로 확인할 수 있다.

Datadog Agent에서 로그를 설정한 후 dd-trace 설정 내에서 샘플링이나 로그도 연계할 수 있다. 로그 또한 Datadog에서 인티그레이션 된 모듈 사용(Json 포맷)을 권장한다. (내 경우 nestjs-pino 사용)

import tracer from 'dd-trace';

tracer.init({
  sampleRate: 1.0,
  logInjection: true,
  env: 'stg',
  service: 'hello-nest',
  tags: {
    owner: 'hyunjin',
    team: 'frontend',
  },
});

export default tracer;

기본적으로 Datadog Agent는 초당 10개로 Trace를 샘플링 한다. (# max_traces_per_second: 10)

https://github.com/DataDog/datadog-agent/blob/main/pkg/config/config_template.yaml#L1076-L1082

Agent를 디폴트로 사용 시, 초당 10개의 트레이스만을 인덱싱 되고 나머지 트레이스는 확인할 수 없다.

(참고: trace.express.request.hit와 같은 메트릭 값을 모든 트레이스를 기준으로 동작한다.)

더 많은 Trace를 인덱싱 하기 위해서는 Agent 내에서 설정 값 변경도 가능하지만, dd-trace에서 sampleRate 환경변수를 사용하면 trace 레벨에서 샘플링 되고, Agent에 덮어쓰여져 trace 레벨에서 샘플링을 권장한다.

APM에서 로그를 연계(logInjection)하면 Json 어트리뷰트에 dd 항목에 trace_id, span_id 등 APM 연동을 위한 정보가 추가된다.

{
"level":30,
"time":1657769072586,
"pid":4923,
"hostname":"DESKTOP-NKOAUS2",
"req":{
  "id":50,
  "method":"GET",
  "url":"/todos/100",
  "query":{},
  "params":{"0":"todos/100"},
  "headers":{
    "host":"localhost:3000",
    "user-agent":"insomnia/2022.4.2",
    "content-type":"application/json",
    "accept":"*/*",
    "content-length":"38"
    },
  "remoteAddress":"::1",
  "remotePort":53118
},
"dd":{
  "trace_id":"1665162753166391892",
  "span_id":"3470287105563600479",
  "service":"hello-nest",
  "version":"1.0.0",
  "env":"stg"
},
"res":{
  "statusCode":500,
  "headers":{
    "x-powered-by":"Express",
    "content-type":"application/json; charset=utf-8",
    "content-length":"69",
    "etag":"W/\"45-6Z1/x1n4vlAJc51QBruAW1S8NSo\""
    }
},
"err":{
  "type":"Error",
  "message":"failed with status code 500",
  "stack":"Error: failed with status code 500\n
      at ServerResponse.onResFinished (/home/hj/project/nomad/hello-nest/node_modules/pino-http/logger.js:115:40)\n
      at ServerResponse.emit (node:events:539:35)\n
      at ServerResponse.emit (/home/hj/project/nomad/hello-nest/node_modules/dd-trace/packages/datadog-instrumentations/src/http/server.js:36:17)\n
      at onFinish (node:_http_outgoing:830:10)\n
      at callback (node:internal/streams/writable:553:21)\n
      at afterWrite (node:internal/streams/writable:498:5)\n
      at afterWriteTick (node:internal/streams/writable:485:10)\n
    afterWriteTick processTicksAndRejections (node:internal/process/task_queues:82:21)"
    },
"responseTime":7,
"msg":"request errored"
}

}

그럼 APM 화면에서 해당 Trace 내에서 생성된 LOG와 연계할 수 있다.

데이터독 로그는 기본적으로 source 언어에 따라 기본적인 로그 파이프라인을 제공한다. 아래와 같이 Application source를 지정하면 Node.js 관련 로그파이프라인이 자동적으로 생성된다. 컨테이너 환경의 경우에는 stdout 로그를 자동으로 가져온다. 다만 Application 에서 log4j나 winston과 같은 json 포맷의 로그 lib를 사용해야 한다. 로그가 json 포맷이 아닐 경우 파이프라인을 메뉴얼 하게 구성해야 한다.

/etc/datadog-agent/conf.d/hello-nest.d

logs:
  - type: file
    path: "~/hello-nest.log"
    service: "hello-nest"
    source: "nodejs"

Agent에서 로그에 대한 플랫폼 내용을 지정해주면 아래와 같이 자동적으로 생성된다.

기본적으로 Datadog 로그에서 보여주는 메시지는 로그 어트리뷰트의 msg가 지정된다.

좀 더 직관적으로 알기 위해 request errored로 표기된 메시지 부분을 변경할 수 있는데, 이것은 로그파이프라인 msg remapper를 통해서 변경할 수 있다. 

기존 msg로 되어있던 부분을 err.stack 으로 변경한다. 그럼 데이터독에서 지정된 msg에 키가 로그의 err.stack으로 변경되어 메시지 부분을 아래와 같이 직관적으로 확인할 수 있다. 로그 레벨도 수정하면 Error 로그로 보일 것이다.

만약 데이터독과 인티그레이션 되지 않은 모듈이나 플랫폼들을 에러 트래킹 하기 위해서는 custom span을 이용한다.

https://docs.datadoghq.com/tracing/trace_collection/custom_instrumentation/nodejs/?tabs=errors  

try{
	...
	throw Error('');
} catch(e) {
	span.setTag('error', e);
	// span.setTag('error.stack', "Error: at ~~~");
	span.setTag('resource.name', 'check user auth');
	span.setTag('error.msg', `${id} 유저 인증 에러`);
}

그럼 아래와 같이 메시지와 에러 stack에 대해서 확인할 수 있다.

추가로 로그는 프로그래밍 언어 뿐만 아니라 다양한 플랫폼 관련 로그 파이프라인도 미리 구성되어 있다.

'APM' 카테고리의 다른 글

Datadog 서버리스 Lambda 모니터링  (0) 2022.09.01
데이터독 GraphQL 연동  (0) 2022.06.22