산점도 위젯
산점도 위젯 (Scatter Plot Widget)
출처: 문서
본문
산점도(scatter plot)는 서로 다른 두 변수 집합의 관측 변화 사이의 가능한 관계를 식별해요. 두 변수 사이의 관계 강도를 검정할 수 있는 시각적·통계적 수단을 제공해요. 산점도 시각화를 사용하면 선택한 범위를 각각의 집계 방식과 함께 두 개의 서로 다른 메트릭으로 그래프로 그릴 수 있어요. 개별 데이터 포인트를 조사하기 위해 원시 이벤트를 플롯할 수도 있어요.
설정 (Setup)
구성 (Configuration)
- X축과 Y축에 사용할 메트릭 또는 다른 데이터셋과 집계를 선택해요.
- 산점도의 각 포인트에 대한 범위를 정의해요. 예를 들어
host,service,app,region. - 선택 사항:
- 색상 기준(color-by) 태그를 활성화해요.
- X축과 Y축 컨트롤을 설정해요.
- 데이터 포인트를 목록으로 보기 위한 범례를 추가해요.
- 그래프에 표시되는 단위를 구성해요.
- 기본적으로 활성화되어 있는 추가 컨텍스트 링크를 추가해요. 컨텍스트 링크는 대시보드 위젯을 Datadog 또는 타사 애플리케이션의 다른 페이지와 연결해줘요.
- 위젯이 사용자 지정 시간 범위를 가질지 대시보드의 전역 시간 범위를 사용할지 선택해요.
- 그래프 제목을 지정하거나 상자를 비워 두면 제안된 제목이 사용돼요.
집계 및 비집계 데이터 (Aggregated and unaggregated data)
산점도는 두 가지 데이터 모드를 지원하며, 그래프 편집기의 모드(Mode) 전환으로 전환할 수 있어요.
- 집계(Aggregated): 필드별로 데이터를 그룹화하고
avg또는sum같은 집계를 적용해요. 각 포인트는 집계된 그룹을 나타내요. - 비집계(Unaggregated): 원시 이벤트를 플롯하며, 각 포인트가 로그, 스팬, RUM 이벤트 같은 단일 이벤트를 나타내요. 이 모드를 사용해서 집계가 숨기는 이상값과 드문 클러스터를 발견하거나, 같은 이벤트의 두 필드를 상호 연결하거나(예: 페이로드 크기가 지연을 예측하는지), 개별 LLM 트레이스를 플롯할 수 있어요.
비집계 모드가 지원하는 데이터 소스 (Supported data sources for unaggregated mode)
다음 소스에서 비집계 데이터를 플롯할 수 있어요.
- Logs
- RUM
- 에이전트 관측성 (Agent Observability)
- Product Analytics
- Spans
- 감사 추적 (Audit Trail)
- Events
- 보안 신호 (Security Signals)
- CI Pipelines
- Network
- 네트워크 장치 흐름 (Network Device Flows)
- 신서틱 테스트 실행 (Synthetics Test Runs)
비집계 데이터 플롯 (Plot unaggregated data)
대시보드에서:
- 대시보드에서 산점도 위젯을 열거나 만들어요.
- 그래프 편집기에서 원시 이벤트를 지원하는 데이터 소스를 선택해요.
- 모드(Mode) 를 비집계(Unaggregated) 로 설정해요.
- 측정값 추가(Add Measure) 를 클릭해서 X축과 Y축을 구성해요.
개별 이벤트가 그래프에 포인트로 나타나요.
탐색 (Navigation)
산점도에 마우스를 올리면 오른쪽 위 모서리에 컨트롤이 표시돼요.
- 밀도 표시(Show density): 데이터 포인트가 가장 많이 집중된 곳을 보여주는 밀도 윤곽을 오버레이해서 클러스터와 패턴을 식별하는 데 도움을 줘요. 켜면 컨트롤이 밀도 숨기기(Hide density) 로 바뀌어요.
- 확대(Zoom in, +) 와 축소(zoom out, -): 줌 레벨을 변경해서 데이터 영역에 초점을 맞춰요.
- 뷰 재설정(Reset View): 플롯을 기본 줌과 위치로 되돌려요.
산점도에서 직접 클릭하고 드래그해서 데이터를 탐색(팬)할 수 있어요.
산점도는 이상값과 최댓값 같은 주목할 만한 포인트를 자동으로 라벨링해요.
API
이 위젯은 **대시보드 API**와 함께 사용할 수 있어요. 위젯 JSON 스키마 정의에 대해서는 다음 표를 참고하세요.
산점도 위젯의 최상위 필드에는 다음이 있어요.
| 필드 | 타입 | 설명 |
|---|---|---|
| color_by_groups | string[] | 색상에 사용되는 그룹 목록. |
| custom_links | object[] | 사용자 지정 링크 목록. |
| description | string | 위젯의 설명. |
| requests [필수] | object | 위젯 정의. |
| time | object | 위젯의 시간 설정. |
| title | string | 위젯 제목. |
| type [필수] | enum | 산점도 위젯 유형. 허용 enum 값: scatterplot |
각 축(x, y, radius, color)은 aggregator, formulas, queries를 포함하는 요청 구성을 가져요. queries는 메트릭, 이벤트 플랫폼, 프로세스, APM, SLO, Cloud Cost 등 다양한 데이터 소스를 지원해요. 전체 예시는 다음과 같아요.
{
"color_by_groups": [],
"custom_links": [
{
"is_hidden": false,
"label": "Search logs for {{host}}",
"link": "https://app.datadoghq.com/logs?query={{host}}",
"override_label": "logs"
}
],
"description": "string",
"requests": {
"table": {
"formulas": [
{
"alias": "my-query",
"dimension": "radius",
"formula": "func(a) + b"
}
],
"queries": [
{
"aggregator": "avg",
"cross_org_uuids": [
"6434abde-xxxx-yyyy-zzzz-da7ad0900001"
],
"data_source": "metrics",
"name": "my_query",
"query": "avg:system.cpu.user{*}",
"semantic_mode": "combined"
}
],
"response_format": "timeseries"
},
"x": {
"aggregator": "string",
"apm_query": {
"compute": {
"aggregation": "avg",
"facet": "@duration",
"interval": 5000
},
"group_by": [
{
"facet": "resource_name",
"limit": 50,
"sort": {
"aggregation": "avg",
"facet": "@string_query.interval",
"order": "desc"
}
}
],
"index": "days-3,days-7",
"multi_compute": [
{
"aggregation": "avg",
"facet": "@duration",
"interval": 5000
}
],
"search": {
"query": ""
}
},
"event_query": {
"compute": {
"aggregation": "avg",
"facet": "@duration",
"interval": 5000
},
"group_by": [
{
"facet": "resource_name",
"limit": 50,
"sort": {
"aggregation": "avg",
"facet": "@string_query.interval",
"order": "desc"
}
}
],
"index": "days-3,days-7",
"multi_compute": [
{
"aggregation": "avg",
"facet": "@duration",
"interval": 5000
}
],
"search": {
"query": ""
}
},
"log_query": {
"compute": {
"aggregation": "avg",
"facet": "@duration",
"interval": 5000
},
"group_by": [
{
"facet": "resource_name",
"limit": 50,
"sort": {
"aggregation": "avg",
"facet": "@string_query.interval",
"order": "desc"
}
}
],
"index": "days-3,days-7",
"multi_compute": [
{
"aggregation": "avg",
"facet": "@duration",
"interval": 5000
}
],
"search": {
"query": ""
}
},
"network_query": {
"compute": {
"aggregation": "avg",
"facet": "@duration",
"interval": 5000
},
"group_by": [
{
"facet": "resource_name",
"limit": 50,
"sort": {
"aggregation": "avg",
"facet": "@string_query.interval",
"order": "desc"
}
}
],
"index": "days-3,days-7",
"multi_compute": [
{
"aggregation": "avg",
"facet": "@duration",
"interval": 5000
}
],
"search": {
"query": ""
}
},
"process_query": {
"filter_by": [],
"limit": "integer",
"metric": "system.load.1",
"search_by": "string"
},
"profile_metrics_query": {
"compute": {
"aggregation": "avg",
"facet": "@duration",
"interval": 5000
},
"group_by": [
{
"facet": "resource_name",
"limit": 50,
"sort": {
"aggregation": "avg",
"facet": "@string_query.interval",
"order": "desc"
}
}
],
"index": "days-3,days-7",
"multi_compute": [
{
"aggregation": "avg",
"facet": "@duration",
"interval": 5000
}
],
"search": {
"query": ""
}
},
"q": "string",
"rum_query": {
"compute": {
"aggregation": "avg",
"facet": "@duration",
"interval": 5000
},
"group_by": [
{
"facet": "resource_name",
"limit": 50,
"sort": {
"aggregation": "avg",
"facet": "@string_query.interval",
"order": "desc"
}
}
],
"index": "days-3,days-7",
"multi_compute": [
{
"aggregation": "avg",
"facet": "@duration",
"interval": 5000
}
],
"search": {
"query": ""
}
},
"security_query": {
"compute": {
"aggregation": "avg",
"facet": "@duration",
"interval": 5000
},
"group_by": [
{
"facet": "resource_name",
"limit": 50,
"sort": {
"aggregation": "avg",
"facet": "@string_query.interval",
"order": "desc"
}
}
],
"index": "days-3,days-7",
"multi_compute": [
{
"aggregation": "avg",
"facet": "@duration",
"interval": 5000
}
],
"search": {
"query": ""
}
}
},
"y": {
"aggregator": "string",
"apm_query": {
"compute": {
"aggregation": "avg",
"facet": "@duration",
"interval": 5000
},
"group_by": [
{
"facet": "resource_name",
"limit": 50,
"sort": {
"aggregation": "avg",
"facet": "@string_query.interval",
"order": "desc"
}
}
],
"index": "days-3,days-7",
"multi_compute": [
{
"aggregation": "avg",
"facet": "@duration",
"interval": 5000
}
],
"search": {
"query": ""
}
},
"event_query": {
"compute": {
"aggregation": "avg",
"facet": "@duration",
"interval": 5000
},
"group_by": [
{
"facet": "resource_name",
"limit": 50,
"sort": {
"aggregation": "avg",
"facet": "@string_query.interval",
"order": "desc"
}
}
],
"index": "days-3,days-7",
"multi_compute": [
{
"aggregation": "avg",
"facet": "@duration",
"interval": 5000
}
],
"search": {
"query": ""
}
},
"log_query": {
"compute": {
"aggregation": "avg",
"facet": "@duration",
"interval": 5000
},
"group_by": [
{
"facet": "resource_name",
"limit": 50,
"sort": {
"aggregation": "avg",
"facet": "@string_query.interval",
"order": "desc"
}
}
],
"index": "days-3,days-7",
"multi_compute": [
{
"aggregation": "avg",
"facet": "@duration",
"interval": 5000
}
],
"search": {
"query": ""
}
},
"network_query": {
"compute": {
"aggregation": "avg",
"facet": "@duration",
"interval": 5000
},
"group_by": [
{
"facet": "resource_name",
"limit": 50,
"sort": {
"aggregation": "avg",
"facet": "@string_query.interval",
"order": "desc"
}
}
],
"index": "days-3,days-7",
"multi_compute": [
{
"aggregation": "avg",
"facet": "@duration",
"interval": 5000
}
],
"search": {
"query": ""
}
},
"process_query": {
"filter_by": [],
"limit": "integer",
"metric": "system.load.1",
"search_by": "string"
},
"profile_metrics_query": {
"compute": {
"aggregation": "avg",
"facet": "@duration",
"interval": 5000
},
"group_by": [
{
"facet": "resource_name",
"limit": 50,
"sort": {
"aggregation": "avg",
"facet": "@string_query.interval",
"order": "desc"
}
}
],
"index": "days-3,days-7",
"multi_compute": [
{
"aggregation": "avg",
"facet": "@duration",
"interval": 5000
}
],
"search": {
"query": ""
}
},
"q": "string",
"rum_query": {
"compute": {
"aggregation": "avg",
"facet": "@duration",
"interval": 5000
},
"group_by": [
{
"facet": "resource_name",
"limit": 50,
"sort": {
"aggregation": "avg",
"facet": "@string_query.interval",
"order": "desc"
}
}
],
"index": "days-3,days-7",
"multi_compute": [
{
"aggregation": "avg",
"facet": "@duration",
"interval": 5000
}
],
"search": {
"query": ""
}
},
"security_query": {
"compute": {
"aggregation": "avg",
"facet": "@duration",
"interval": 5000
},
"group_by": [
{
"facet": "resource_name",
"limit": 50,
"sort": {
"aggregation": "avg",
"facet": "@string_query.interval",
"order": "desc"
}
}
],
"index": "days-3,days-7",
"multi_compute": [
{
"aggregation": "avg",
"facet": "@duration",
"interval": 5000
}
],
"search": {
"query": ""
}
}
}
},
"time": {
"hide_incomplete_cost_data": false,
"live_span": "5m"
},
"title": "string",
"title_align": "string",
"title_size": "string",
"type": "scatterplot",
"xaxis": {
"include_zero": false,
"label": "string",
"max": "string",
"min": "string",
"scale": "string"
},
"yaxis": {
"include_zero": false,
"label": "string",
"max": "string",
"min": "string",
"scale": "string"
}
}