이 가이드에서는 측정항목 구성 생성기(MCG) 도구의 /api/v1/generate_metrics_config 엔드포인트에 대한 JSON 요청 형식을 자세히 설명합니다. 이 형식을 사용하면 사람이 읽을 수 있는 구조로 원격 분석 캠페인(데이터 수집, 온디바이스 처리, 보고서 생성 지정)을 정의할 수 있습니다.
MCG 도구는 이 JSON 객체의 유효성을 검사하여 유형 불일치, 순환 종속성, 정의되지 않은 참조와 같은 문제를 확인한 다음 MetricsConfig 프로토콜 버퍼 (protobuf) 메시지로 컴파일합니다. 이 MetricsConfig 메시지는 기기 내 원격 분석 서비스가 캠페인을 실행하기 위해 실행하는 바이너리 형식입니다.
기본 요건: JSON 스키마, protobuf, 기본 데이터 구조에 익숙해야 합니다. 개념 개요는 측정항목 구성 개념을 참고하세요.
구성 설명 작성 방법
측정항목 수집 캠페인을 설계하려면 다음 논리적 흐름을 따르세요.
- 데이터 소스 지정: 데이터의 출처를 정의합니다.
- 로직 및 처리 정의: 데이터를 수집하는 시점과 데이터를 처리하는 방법을 위한 규칙을 설정합니다.
- 출력 생성: 처리된 데이터를 최종 메시지로 패키징합니다.
- 최상위 필드: UUID, 신호 정의, 수명 주기 제어와 같은 최상위 필드를 추가합니다.
예: 평균 속도 보고서
이 가이드에서는 예를 사용하여 모든 구성요소가 어떻게 함께 작동하는지 보여줍니다. 매분 평균 차량 속도를 계산하는 보고서를 만듭니다. 속도 데이터를 수집하는 데이터 소스 (SpeedSource), 실행 흐름을 제어하는 트리거(OnNewSpeed, EveryMinute), 평균을 계산하는 집계기(SpeedAggregator), 결과를 패키징하는 측정항목 보고서 구성 (MinuteReport)을 정의합니다. 확장 가능한 섹션의 예는 이 시나리오를 기반으로 합니다.
데이터 소스 지정
원격 분석은 SDV 서비스 (SDV 미들웨어를 통해)와 구성 가능한 게시자 레지스트리 기반 게시자로부터 데이터를 수집하는 것을 지원합니다.
SDV 서비스 (pub/sub 기반): VSIDL에 정의된 pub/sub 채널에서 데이터를 사용할 수 있습니다.
SDV 서비스 (RPC 기반): 서비스가
CreateSubscription또는GetLatestMessageRPC를 노출하는 경우 데이터를 사용할 수 있습니다.구성 가능한 게시자 레지스트리 기반 게시자: 애플리케이션이
IConfigurablePublisherRegistryAndroid 바인더 인터페이스 또는 원격 분석 SDK의 구성 가능한 게시자 레지스트리 라이브러리를 사용하여 자체 등록하는 경우 데이터를 사용할 수 있습니다.
SDV에서 데이터를 사용하려면 데이터 소스 (concept)를 정의하고 data_sources 배열에 추가합니다.
데이터 소스 객체의 필드 (data_sources 목록의 항목) |
|||||
|---|---|---|---|---|---|
name |
측정항목 구성 내에서 이 데이터 소스를 식별하는 사용자 정의 문자열입니다. | ||||
source_identifier |
서비스를 검색하는 데 사용되는 식별자입니다. 자세한 내용은 source_identifier 형식을 참고하세요. |
||||
connection_type |
SUBSCRIPTION (연속 데이터 스트림의 경우, 데이터 트리거에 필요) 또는 ON_DEMAND (주문형 가져오기의 경우, 자세한 내용은 데이터 소스 구성 참고) |
||||
선택사항configuration |
RPC 및 구성 가능한 게시자 레지스트리만 해당 다음 필드를 사용하여 데이터 소스를 구성하는 객체입니다.
|
||||
SUBSCRIPTION 연결 유형의 필드 |
|||||
선택사항sub_sampling_interval_ms |
게시/구독 전용. 메시지 간 최소 간격을 지정하여 메시지 빈도를 제한하는 음수가 아닌 정수 (밀리초)입니다. | ||||
선택사항fetch_last_message(기본값: false) |
Pub/Sub 전용. 부울. true인 경우 연결 시 최신 메시지를 가져옵니다. |
||||
일부 옵션은 모든 유형의 데이터 소스에서 사용할 수 없습니다. 자세한 내용은 데이터 소스 통합 가이드를 참고하세요.
source_identifier 형식
원격 분석 서비스는 여러 소스 식별자 형식을 허용합니다. 개요는 측정항목 구성의 데이터 소스 정의를 참고하세요.
MCG는 단위 유형 이름 형식을 사용하는 경우에만 source_identifier에서 protobuf 메시지 유형을 추론합니다. FQIN 또는 맞춤 이름 (구성 가능한 게시자 레지스트리에서)을 사용하는 경우 MCG에서 유형을 추론할 수 없습니다. 이 경우 data_source_message_types을 제공해야 합니다. 유형이 카탈로그에 없는 경우 descriptor_protos에 정의도 제공해야 합니다.
예: 데이터 소스 정의
이 예에서는 차량 속도를 보고합니다. 먼저 VSIDL 카탈로그를 참고하여 이 데이터를 게시하는 서비스를 식별합니다.
SDV 코드베이스의 샘플 카탈로그를 사용하여 관련 서비스를 식별합니다. source_identifier 형식과 일관되게 protobuf 메시지 유형 mcg.test.subpkg.speed_msg을 지정합니다. 속도는 일반적으로 자주 게시되므로 sub_sampling_interval_ms를 사용하여 초당 하나의 메시지로 업데이트를 제한하세요.
{ "name": "SpeedSource", "source_identifier": "mcg.test.subpkg.speed_msg", "connection_type": "SUBSCRIPTION", "sub_sampling_interval_ms": 1000 // Limit updates to 1 per second }
로직 및 처리 정의
로직은 함께 작동하는 두 구성요소에 의해 처리됩니다. 트리거 (개념)는 특정 작업이 발생하는 시점을 정의합니다. 어그리게이터 (개념)는 이러한 트리거를 기반으로 데이터가 처리되는 방식을 정의합니다. 표현식 (개념)은 조건을 트리거하고 집계 로직을 실행하는 데 중요하므로 이 섹션에서는 먼저 표현식을 작성하는 방법을 설명합니다.
표현식
표현식을 사용하면 사람이 읽을 수 있는 구문을 사용하여 계산과 조건을 정의할 수 있습니다. MCG는 이러한 문자열을 기기 내 평가에 최적화된 실행 파일 형식으로 컴파일합니다.
표현식은 산술 계산, 논리 조건, 데이터 비교를 표현할 수 있습니다. 연산자 및 함수를 포함한 전체 구문은 표현식 구문을 참고하세요.
데이터 업데이트 빈도: 표현식이 데이터 소스에 액세스할 때 가져오기 동작은 연결 유형에 따라 다릅니다.
SUBSCRIPTION: 원격 분석 서비스에서 캐시한 마지막으로 수신된 메시지를 사용합니다. (참고:sub_sampling_interval_ms가 설정된 경우 절대 최신 게시 메시지와 다를 수 있습니다.)ON_DEMAND: 서비스에서 최신 메시지를 가져오기 위한 즉각적인 호출을 트리거합니다.
유형 제약 조건
- 배열: 직접 배열 색인 액세스 (예:
my_data_source.my_array[0])는 지원되지 않습니다. - 타입 안전성: 호환되는 유형을 비교해야 합니다 (예: 문자열 필드를 정수 목록과 비교하지 않음).
예: 표현식
이 예에서는 속도 값을 추출하여 평균을 계산해야 합니다. 또한 조건부 트리거를 위해 차량이 과속 (100km/h 초과)인지 확인해야 합니다. 데이터 소스에서 사용하는 protobuf 메시지 정의에서 필드 이름 (이 경우 speed)을 확인할 수 있습니다. 다음 표현식으로 이를 달성할 수 있습니다.
SpeedSource.speed:SpeedSource데이터 소스에서speed필드의 값을 가져옵니다.SpeedSource.speed > 27.7: 속도가 27.7m/s (약 100km/h)보다 크면true로 평가됩니다.
트리거: 작업이 발생하는 시점 정의
트리거는 집계기 평가, 보고서 생성, 수집 수명 주기 제어 등 작업이 실행되는 시점을 정의합니다. 정의된 모든 트리거를 최상위 triggers 배열에 추가합니다.
트리거 객체의 필드 (triggers 목록의 항목) |
|
|---|---|
name |
측정항목 구성에서 이 트리거의 고유 식별자입니다. |
periodicdataconditional |
동작을 정의하려면 이러한 필드 중 하나만 제공해야 합니다. |
데이터 트리거
SUBSCRIPTION 데이터 소스가 새 메시지 (concept)를 제공할 때 발생합니다.
data 객체의 필드 (트리거에 있음) |
|
|---|---|
source_name |
이 트리거가 수신 대기하는 data_source의 name입니다. |
예: 데이터 트리거
이 예에서는 SpeedSource가 새 메시지를 게시할 때마다 평균 속도 계산을 업데이트합니다. 이 데이터 트리거는 다음 상황이 발생할 때마다 실행됩니다.
{ "name": "OnNewSpeed", "data": { "source_name": "SpeedSource" // Reference to the defined data source } }
주기적 트리거
일정한 간격으로 실행됩니다 (개념).
periodic 객체의 필드 (트리거에 있음) |
|
|---|---|
period_ms |
밀리초 단위의 간격을 정의하는 음수가 아닌 숫자입니다. |
예: 주기적 트리거
이 예에서는 1분마다 보고해야 합니다. 이 주기적 트리거는 60,000ms마다 실행되어 보고서를 생성합니다.
{ "name": "EveryMinute", "periodic": { "period_ms": 60000 // 60,000 ms = 60 seconds } }
조건부 트리거
표현식 (개념)의 평가에 따라 실행됩니다. 평가를 시작하려면 하나 이상의 상위 트리거가 필요합니다. 이는 표현식의 데이터 소스 또는 집계기의 데이터 트리거이거나 데이터를 폴링하는 주기적 트리거인 경우가 많습니다.
conditional 객체의 필드 (트리거에 있음) |
|
|---|---|
triggers |
하나 이상의 상위 트리거 이름이 포함된 배열입니다. 상위 트리거가 실행되면 조건부 트리거가 표현식을 평가합니다. |
expression |
평가할 표현식입니다. 표현식을 참고하세요. |
condition_type |
표현식의 평가에 따라 트리거가 실행되어야 하는 시점을 지정합니다. |
조건 유형
condition_type 사전에는 사용 가능한 조건 유형 중 하나가 키로 정확히 하나 포함되어야 합니다. 자세한 내용은 조건부 트리거를 참고하세요.
condition_type 객체의 필드 (상호 배타적) |
|
|---|---|
is_trueis_false |
불리언 표현식이 각각 true 또는 false로 평가될 때 실행됩니다. |
rising_edge |
숫자인 경우 값이 증가할 때 실행됩니다. 표현식이 불리언인 경우
|
falling_edge |
숫자인 경우 값이 감소할 때 실행됩니다. 표현식이 불리언인 경우
|
all_changes |
표현식의 결과가 이전 값과 다른 경우 실행됩니다. 에지 옵션이 설정된 경우 숫자 및 불리언 값만 지원됩니다.
|
가장자리 옵션
rising_options 및 falling_options 객체에는 다음 필드가 있습니다. 제공된 경우 해당 전환은 지속 시간 요구사항을 충족해야 합니다.
지정된 옵션이 없는 전환은 즉시 실행됩니다.
| 가장자리 옵션 객체의 필드 | |
|---|---|
min_duration_ms |
트리거가 실행되기 전에 조건이 새 상태로 유지되어야 하는 시간을 지정하는 음수가 아닌 숫자 (밀리초)입니다. |
선택사항require_exact |
부울. true인 경우 트리거가 실행되려면 기간 중에 게시된 모든 값이 동일해야 합니다. |
예: 조건부 트리거
다음 트리거는 에지 옵션을 사용합니다. 속도가 27.7m/s를 초과하고 5초 이상 높은 상태로 유지되면 트리거됩니다.
{ "name": "SpeedingFor5Seconds", "conditional": { "triggers": ["OnNewSpeed"], "expression": "SpeedSource.speed > 27.7", "condition_type": { "rising_edge": { "rising_options": { "min_duration_ms": 5000 // Condition must hold for 5s in new state } } } } }
집계기: 데이터 처리 방식 정의
상태 저장 중간 데이터 처리 (개념)에 집계기를 사용합니다.
애그리게이터를 정의하고 aggregators 배열에 추가합니다.
집계기는 데이터를 변환하여 다른 집계기 및 보고서에서 사용할 수 있도록 합니다.
애그리게이터 필드 (aggregators 목록의 항목) |
|
|---|---|
name |
이 집계기를 식별하는 사용자 정의 문자열입니다. 표현식은 이름을 통해 이 집계기를 참조하여 결과를 액세스할 수 있습니다. |
trigger_names |
이 집계가 평가되도록 하는 하나 이상의 트리거 이름의 배열입니다. |
선택사항reset_on_get |
불리언, 기본값: `false`. `true`인 경우 다른 집계기, 측정항목 보고서 또는 조건부 트리거가 값에 액세스한 후 시스템이 집계 상태를 재설정합니다. |
message_builder |
읽고, 처리하고, 집계할 데이터를 정의합니다. 그러면 출력 메시지의 필드가 다른 집계기 및 보고서의 데이터 소스가 됩니다. field_assignments를 사용하며 각 할당은 출력 메시지의 필드를 정의합니다. |
메시지 빌더
message_builder 객체는 출력 메시지 구조와 필드를 계산하는 데 사용되는 집계 로직을 정의합니다. 이 속성은 어그리게이터와 보고서 구성 모두에서 사용됩니다.
message_builder 객체의 필드 (집계기 또는 보고서) |
|
|---|---|
message_type |
출력의 protobuf 메시지 유형의 정규화된 이름입니다. 생략하면 MCG는 field_assignments의 추론된 출력 유형을 기반으로 맞춤 메시지 유형을 만듭니다. 메시지 빌더가 측정항목 보고서의 일부이고 보고서가 사전 정의된 특정 protobuf 메시지 정의와 일치해야 하는 경우에만 사용하세요. |
field_assignments |
필드 정의 객체의 배열입니다. 각 객체는 출력 메시지의 필드와 값을 계산하는 로직을 지정합니다. |
필드 할당 객체의 필드 (field_assignments 목록의 항목) |
|||||||
|---|---|---|---|---|---|---|---|
field_name |
필드의 사용자 정의 이름입니다. 표현식(aggregator_name.field_name)에서 점 표기법을 사용할 때 객체 내의 특정 값을 식별합니다. |
||||||
aggregation |
다음 필드를 사용하여 시스템이 필드의 값을 계산하는 방법을 정의하는 객체입니다.
|
||||||
예: 애그리게이터
이 예에서는 분 보고서 간의 통계를 계산합니다. 이 애그리게이터는 OnNewSpeed에 의해 트리거되어 평균 속도(avg)를 계산하고, 판독 횟수 (count)를 계산하고, 마지막 5개의 속도 값 (vector)을 저장합니다. reset_on_get을 true로 설정합니다. 이렇게 하면 MinuteReport에서 통계를 읽을 때마다 통계가 재설정되어 다음 분의 애그리게이터를 위한 새 수집 창이 시작됩니다.
{ "name": "SpeedAggregator", "trigger_names": ["OnNewSpeed"], // Update aggregation on new speed data "reset_on_get": true, // Reset stats after they are read by the report configuration "message_builder": { "field_assignments": [ { "field_name": "average_speed", "aggregation": { "@type": "avg", "expression": "SpeedSource.speed" } }, { "field_name": "speed_reading_count", "aggregation": { "@type": "count" // Counts triggers (that is, processed speed readings) since last reset } }, { "field_name": "speed_history_last5", "aggregation": { "@type": "vector", "expression": "SpeedSource.speed", "max_length": 5 // Keep last 5 readings } } ] } }
출력 만들기
원격 분석 캠페인의 최종 출력을 정의하려면 report_configs 배열 (concept)에 객체를 추가합니다. 이러한 구성에 따라 처리된 데이터가 패키징되는 방식과 생성되는 시기가 결정됩니다. 하나의 측정항목 구성에서 여러 보고서 구성을 정의하여 구성요소를 재사용할 수 있습니다.
trigger_names 필드를 사용하여 보고서 생성을 제어합니다. 또한 report_initial를 사용하여 구성이 활성화될 때 즉시 보고서를 생성하고 report_incomplete를 사용하여 데이터 수집이 중단될 때 최종 보고서를 생성할 수 있습니다.
참고: 처리를 출력에 연결하려면 none 집계 유형(@type: "none")을 사용하여 Aggregator에서 미리 계산된 값을 읽으세요. 보고서는 일반적으로 상태 비저장 스냅샷이므로 이렇게 하면 복잡한 상태 저장 로직이 애그리게이터 내에 유지되고 보고서는 서식 지정에 사용됩니다.
보고서 구성 객체의 필드 (report_configs 목록의 항목) |
|
|---|---|
name |
보고서의 고유한 이름입니다. 이 이름은 생성된 보고서 메타데이터에 표시됩니다. |
trigger_names |
보고서가 생성되고 게시되도록 하는 트리거 이름의 배열입니다. |
message_builder |
자세한 내용은 메시지 빌더를 참고하세요. 보고서의 콘텐츠를 정의합니다. 집계는 보고서가 트리거될 때만 평가됩니다. 예를 들어 벡터 집계는 보고서당 하나의 값을 추가하고 개수 집계는 보고서 번호를 반영합니다. |
선택사항report_incomplete(기본값: `false`) |
불리언 `true`인 경우 데이터가 누락되더라도 시스템에서 종료 시 또는 데이터 수집이 종료될 때 최종 보고서를 생성합니다. |
선택사항report_initial(기본값: `false`) |
불리언 `true`인 경우 측정항목 구성이 활성화되면 시스템에서 즉시 보고서를 생성합니다. |
예: 보고서 구성
마지막으로 예의 보고서 구성을 정의합니다. EveryMinute에 의해 트리거됩니다. 계산된 평균 속도와 읽기 수를 none 집계를 사용하여 SpeedAggregator에서 읽어 사전 집계된 값을 보고서에 전달합니다.
{ "name": "MinuteReport", "trigger_names": ["EveryMinute"], // Generate report every minute "message_builder": { "field_assignments": [ { "field_name": "average_speed", "aggregation": { "@type": "none", // Read the value directly from the aggregator "expression": "SpeedAggregator.average_speed" } }, { "field_name": "reading_count", "aggregation": { "@type": "none", "expression": "SpeedAggregator.speed_reading_count" } } ] } }
최상위 필드
data_sources, aggregators, triggers, report_configs 배열 외에도 측정항목 구성 설명에는 신호 카탈로그에 대한 참조가 필요합니다. 선택적 필드를 포함하여 특정 UUID를 할당하고 수집 수명 주기를 관리할 수도 있습니다.
UUID 설정
각 MetricsConfig에는 범용 고유 식별자 (UUID)가 필요합니다. existing_uuid를 제공하면 MCG에서 이를 사용합니다. 그렇지 않으면 임의의 값이 생성됩니다. 배포와 도구 간 일관성을 위해 existing_uuid을 지정합니다.
문자열은 소문자만 포함하는 유효한 하이픈 UUID여야 합니다.
"existing_uuid": "a1a2a3a4-b1b2-c1c2-d1d2-d3d4d5d6d7d8",
신호 정의
신호 이름과 유형을 검증하려면 MCG에서 차량 신호 카탈로그에 액세스해야 합니다. 이는 VSIDL .proto 정의가 포함된 protobuf FileDescriptorSet입니다 (패키지화되어 MCG에 업로드됨). 카탈로그 생성 및 업로드에 관한 자세한 내용은 차량 신호 카탈로그를 참고하세요.
JSON 객체의 vs_version 필드에 카탈로그 버전을 지정합니다.
"vs_version": "v1.0",
수명 주기 트리거 정의
원격 분석 캠페인과 관련하여 MetricsConfig의 수명 주기는 데이터가 실제로 기록되는 시점을 결정합니다. 캠페인 관리 시스템이 기기에 구성을 배포하고 활성화하는 동안 수명 주기 트리거를 사용하여 해당 배포 내에서 데이터가 수집되는 시점을 정확하게 제어할 수 있습니다.
이렇게 하면 구성을 비활성화하지 않고도 '이동' (IgnitionOn~IgnitionOff) 또는 '충전 세션'과 같은 차량 사용 패턴에 맞춰 데이터 수집을 조정할 수 있습니다.
세션 제어 (시작/일시중지):
start_trigger_name및stop_trigger_name를 사용하여 수집 시점을 제어합니다. 예를 들어 차량이 운전 중일 때만 데이터를 수집하려면IgnitionOn를 시작 트리거로 사용하고IgnitionOff를 중지 트리거로 사용합니다. 구성은 기기에서 활성 상태로 유지되지만 중지 트리거가 실행되면 효과적으로 '일시중지' (수집 및 처리 중지)되며 시작 트리거가 다시 실행될 때만 다시 시작됩니다.중요: 이는 단순히 수집을 일시중지합니다. 논리적 창을 정의하거나, 데이터 세트를 분리하거나, 다른 부작용이 없습니다. 수집이 일시중지되거나 재개될 때 집계기 값이 재설정되지 않습니다.
일회성 감지 (완료): 구성이 한 번만 실행되어야 하는 경우 (예: 특정 오류 코드의 첫 번째 발생을 감지) 캠페인이 기술적으로 여전히 활성 상태인 경우에도 해당 기기에서 영구적으로 비활성화되는 경우
deactivate_trigger_name를 사용합니다.
수명 주기 트리거를 지정하지 않으면 캠페인에서 구성이 활성화될 때 데이터 수집이 즉시 시작되고 캠페인이 종료될 때까지 계속됩니다.
| 최상위 수명 주기 필드 (루트 객체) | |
|---|---|
선택사항start_trigger_name |
수집 세션을 시작하는 트리거의 이름입니다. stop_trigger_name 없이 설정할 수 있습니다. |
선택사항stop_trigger_name |
수집 세션을 일시중지하는 트리거의 이름입니다 (예: 차량이 정지된 경우). 설정된 경우 start_trigger_name도 설정해야 합니다. |
선택사항deactivate_trigger_name |
`MetricsConfig` 를 완전히 종료하고 비활성화하는 트리거의 이름입니다. |
고급: 맞춤 프로토 정의
두 가지 주요 경우에 MCG가 측정항목 구성 설명의 모든 메시지 유형을 이해하기에 vs_version만으로는 충분하지 않습니다.
- 유형 추론 실패:
source_identifier형식에 설명된 대로source_identifier에서 FQIN 또는 맞춤 이름을 사용하는 경우 MCG에서 유형을 추론할 수 없습니다. - 맞춤 메시지: 측정항목 구성 설명에서
vs_version에 지정된 VSIDL 카탈로그에 없는 protobuf 메시지를 사용합니다. 이는 맞춤 보고서 형식의message_builder에서message_type를 설정할 때 발생합니다.
이 경우 data_source_message_types를 사용하여 MCG가 유형을 추론하도록 돕고 descriptor_protos를 사용하여 메시지 정의를 제공합니다.
data_source_message_types
source_identifier 문자열을 정규화된 protobuf 메시지 유형에 매핑합니다.
data_source_message_types의 키는 data_sources 항목의 source_identifier 값과 일치해야 합니다.
"data_source_message_types": {
"MyCustomSpeedService": "com.sdv.example.SampleMessage"
}
descriptor_protos
구성된 vs_version에 없는 data_source_message_types 또는 message_builder에 사용된 메시지 유형의 정의를 제공합니다.
descriptor_protos 배열에 base64로 인코딩된 descriptorpb.FileDescriptorSet를 전달합니다. Protobuf 컴파일러 protoc를 사용하여 .proto 파일에서 이를 생성합니다.
"descriptor_protos": [
"Cu8BCiZtY2cvdGVzdGRhdGEvbWF4YXZnY3..." // Base64 string
]
예: 전체 구성 설명
이전 섹션에서는 예시의 모든 구성요소를 정의합니다. 즉, 해당 분 동안 관찰된 평균 차량 속도로 매분 보고서를 생성합니다.
구성요소는 다음과 같습니다.
- 초당 최대 한 번 속도 데이터를 가져오는 데이터 소스 (
SpeedSource) SpeedSource이 데이터를 전송할 때 실행되는 데이터 트리거 (OnNewSpeed)입니다.- 60초마다 실행되는 주기적 트리거 (
EveryMinute) OnNewSpeed를 사용하여 평균 속도를 계산하고, 판독값을 계산하고, 최근 값을 저장하며, 읽을 때 재설정하는 애그리게이터 (SpeedAggregator)입니다.EveryMinute를 사용하여SpeedAggregator의 평균 속도와 개수가 포함된 보고서를 트리거하는 보고서 구성 (MinuteReport)- 측정항목 구성을 식별하고 신호 정의에 사용할 VSIDL 카탈로그를 지정하는 최상위 필드 (
existing_uuid,vs_version)
이러한 요소가 결합되면 측정항목 구성에 대한 완전한 설명이 됩니다.
{ "existing_uuid": "a1a2a3a4-b1b2-c1c2-d1d2-d3d4d5d6d7d8", // Unique identifier for the configuration "vs_version": "example_version", // Version of the VSIDL catalog to use "data_sources": [ { "name": "SpeedSource", "source_identifier": "mcg.test.subpkg.speed_msg", "connection_type": "SUBSCRIPTION", "sub_sampling_interval_ms": 1000 } ], "aggregators": [ { "name": "SpeedAggregator", "trigger_names": ["OnNewSpeed"], "reset_on_get": true, "message_builder": { "field_assignments": [ { "field_name": "average_speed", "aggregation": { "@type": "avg", "expression": "SpeedSource.speed" } }, { "field_name": "speed_reading_count", "aggregation": { "@type": "count" } }, { "field_name": "speed_history_last5", "aggregation": { "@type": "vector", "expression": "SpeedSource.speed", "max_length": 5 } } ] } } ], "triggers": [ { "name": "OnNewSpeed", "data": { "source_name": "SpeedSource" } }, { "name": "EveryMinute", "periodic": { "period_ms": 60000 } } ], "report_configs": [ { "name": "MinuteReport", "trigger_names": ["EveryMinute"], "message_builder": { "field_assignments": [ { "field_name": "average_speed", "aggregation": { "@type": "none", "expression": "SpeedAggregator.average_speed" } }, { "field_name": "reading_count", "aggregation": { "@type": "none", "expression": "SpeedAggregator.speed_reading_count" } } ] } } ] }
참조 템플릿
API 정의는 MCG API 참조를 확인하세요.
다음 섹션에서는 측정항목 구성 설명의 전체 참조를 제공합니다. 이를 가이드로 사용하여 측정항목 구성의 자체 설명을 빌드하세요.
최상위 필드
{
"existing_uuid": "00000000-0000-0000-0000-000000000000", // Optional
"vs_version": "example_version", // Optional
"descriptor_protos": ["..."], // Optional. Base64 encoded FileDescriptorSet
"data_source_message_types": {
"ExampleServiceName": "com.example.ProtoMessage"
}, // Optional
"start_trigger_name": "DataTriggerExample", // Optional
"stop_trigger_name": "ConditionalTriggerExample", // Optional
"deactivate_trigger_name": "PeriodicTriggerExample" // Optional
}
입력: 데이터 소스 및 집계기
{
"data_sources": [
{
"name": "SubscriptionExample",
"source_identifier": "com.example.sdv.ExampleMessage|example-unit",
"connection_type": "SUBSCRIPTION", // Options: SUBSCRIPTION (default), ON_DEMAND
"sub_sampling_interval_ms": 100, // Optional
"fetch_last_message": false // Optional. Default: false
},
{
"name": "RegistryExample",
// Configurable Publisher Registry-based publisher (matches data_source_message_types)
"source_identifier": "ExampleServiceName",
"connection_type": "SUBSCRIPTION"
},
{
"name": "GetterExample",
"source_identifier": "com.example.sdv.ExampleConfig|example-unit",
"connection_type": "ON_DEMAND",
"configuration": {
"type_url": "type.googleapis.com/example.Config",
"value_json": {} // Or value_textproto, value (base64)
}
}
],
"aggregators": [
{
"name": "AggregatorExample",
"trigger_names": ["DataTriggerExample"],
"reset_on_get": false, // Optional. Default: false. If true, resets state after it's read
"message_builder": {
"message_type": "com.example.AggregatedMessage", // Optional
"field_assignments": [
{
"field_name": "avg_example",
"aggregation": {
// Options: avg, count, min, max, sum, stddev, delta, vector, none
"@type": "avg",
"expression": "SubscriptionExample.value"
}
},
{
"field_name": "count_example",
"aggregation": {
"@type": "count" // Counts number of evaluations. No expression needed
}
},
{
"field_name": "vector_example",
"aggregation": {
"@type": "vector",
"expression": "SubscriptionExample.value",
"max_length": 10 // Optional. If set, creates a ring buffer
}
}
]
}
}
]
}
로직 및 처리: 트리거
{
"triggers": [
{
"name": "PeriodicTriggerExample",
"periodic": { "period_ms": 1000 }
},
{
"name": "DataTriggerExample",
"data": { "source_name": "SubscriptionExample" }
},
{
"name": "ConditionalTriggerExample",
"conditional": {
"triggers": ["PeriodicTriggerExample"],
"expression": "SubscriptionExample.value > 0",
"condition_type": {
// Options: is_true, is_false, rising_edge, falling_edge, all_changes
"rising_edge": {
"rising_options": { "min_duration_ms": 0, "require_exact": false }
}
}
}
}
]
}
출력: 보고서 구성
{
"report_configs": [
{
"name": "ReportExample",
"trigger_names": ["PeriodicTriggerExample"],
"report_incomplete": false, // Optional. Default: false
"report_initial": false, // Optional. Default: false
"message_builder": {
"message_type": "com.example.ReportMessage", // Optional. Must be defined in VSIDL catalog or descriptor_protos. Message type will be inferred if not provided
"field_assignments": [
{
"field_name": "avg_example",
"aggregation": {
"@type": "none", // Passthrough since aggregation is done in AggregatorExample
"expression": "AggregatorExample.avg_example"
}
}
]
}
}
]
}
표현식 구문
| 카테고리 | 구문 | 설명 |
|---|---|---|
| 데이터 액세스 | source_namesource_name.fieldsource_name.field.subfield |
데이터 소스 또는 애그리게이터에서 전체 메시지에 액세스 메시지의 특정 필드에 액세스 (중첩된 필드 포함) |
| 산술 | +, -, *, /, %, ** |
표준 수학 **은 지수입니다. |
| 논리 | &&, ||, !, ^ |
AND, OR, NOT, XOR |
| 관계형 | ==, !=, <, <=, >, >= |
== 및 !=은 모든 유형에서 작동합니다. 숫자가 필요한 경우도 있습니다. |
| 목록 | contains(list, item)doesnotcontain(list, item)alleq(list, value) |
벡터 (배열)에서 작동합니다. alleq(list, value)는 list의 모든 항목이 value와 같으면 true를 반환합니다. |
| 함수 | timestamp(clock_type) |
현재 시간(나노초)clock_type: REALTIME_CLOCK 또는MONOTONIC_TIME_SINCE_BOOT_OR_RESUME |
abs(n) |
절댓값 | |
floor(n), round(n), ceil(n) |
Rounding 함수 | |
| 작업 순서 | () |
우선순위의 표준 그룹화 |