En esta guía, se detalla el formato de solicitud JSON para el extremo /api/v1/generate_metrics_config de la herramienta Metrics Configuration Generator (MCG). Este formato te permite definir una campaña de telemetría (especificando la recopilación de datos, el procesamiento en el dispositivo y la generación de informes) en una estructura legible por humanos.
La herramienta de MCG valida este objeto JSON, verifica si hay problemas como discrepancias de tipos, dependencias circulares o referencias no definidas, y, luego, lo compila en un mensaje de búfer de protocolo (protobuf) MetricsConfig. Este mensaje MetricsConfig es el formato binario que ejecuta el servicio de Telemetría integrado en el dispositivo para llevar a cabo la campaña.
Requisitos previos: Debes conocer los esquemas JSON, protobuf y las estructuras de datos básicas. Para obtener una descripción general conceptual, consulta Conceptos de configuración de métricas.
Cómo abordar la escritura de una descripción de configuración
Para diseñar una campaña de recopilación de métricas, sigue este flujo lógico:
- Especifica las fuentes de datos: Define de dónde provienen tus datos.
- Define la lógica y el procesamiento: Configura reglas para determinar cuándo recopilar datos y cómo procesarlos.
- Crear salida: Empaqueta los datos procesados en un mensaje final.
- Campos de nivel superior: Agrega campos de nivel superior, como UUID, definiciones de indicadores y control del ciclo de vida.
Ejemplo: Informe de velocidad promedio
En esta guía, se usa un ejemplo para mostrar cómo se combinan todos los componentes. Se crea un informe que calcula la velocidad promedio del vehículo cada minuto. Se define una fuente de datos (SpeedSource) para recopilar datos de velocidad, activadores (OnNewSpeed, EveryMinute) para controlar el flujo de ejecución, un agregador (SpeedAggregator) para calcular el promedio y una configuración del informe de métricas (MinuteReport) para empaquetar el resultado. Los ejemplos de las secciones desplegables se basan en esta situación.
Especifica fuentes de datos
La telemetría admite la recopilación de datos de los servicios de SDV (a través del middleware de SDV) y de los publicadores basados en el registro de publicadores configurable.
Servicios de SDV (basados en Pub/Sub): Los datos están disponibles en los canales de Pub/Sub definidos en VSIDL.
Servicios de SDV (basados en RPC): Los datos están disponibles si el servicio expone RPC de
CreateSubscriptionoGetLatestMessage.Publicadores configurables basados en el Registro de publicadores: Los datos están disponibles si la aplicación se registra con la interfaz de Binder de
IConfigurablePublisherRegistrypara Android o la biblioteca del Registro de publicadores configurable del SDK de Telemetría.
Para usar datos en SDV, define una fuente de datos (concepto) y agrégala al array data_sources.
Campos de un objeto de fuente de datos (elemento de la lista data_sources) |
|||||
|---|---|---|---|---|---|
name |
Es una cadena definida por el usuario que identifica esta fuente de datos dentro de la configuración de métricas. | ||||
source_identifier |
Es el identificador que se usa para descubrir el servicio. Para obtener más información, consulta el formato de source_identifier. |
||||
connection_type |
SUBSCRIPTION para un flujo de datos continuo (obligatorio para los activadores de datos) o ON_DEMAND para la recuperación a demanda (para obtener más detalles, consulta la configuración de fuentes de datos). |
||||
opcionalconfiguration |
Solo para el registro de publicadores configurable y la RPC Objeto para configurar la fuente de datos con los siguientes campos:
|
||||
Campos para el tipo de conexión SUBSCRIPTION |
|||||
opcionalsub_sampling_interval_ms |
Solo para Pub/Sub. Es un número entero no negativo (en milisegundos) para limitar la frecuencia de los mensajes especificando el intervalo mínimo entre ellos. | ||||
Opcionalfetch_last_message(predeterminado: false) |
Solo Pub/Sub. Booleano. Si es true,
recupera el mensaje más reciente al establecer la conexión. |
||||
No todas las opciones están disponibles para todos los tipos de fuentes de datos. Consulta la guía de integración de fuentes de datos para obtener información detallada.
Formato de source_identifier
El servicio de telemetría acepta varios formatos de identificadores de origen. Consulta Definición de la fuente de datos en la configuración de métricas para obtener una descripción general.
MCG infiere el tipo de mensaje de protobuf a partir de source_identifier solo si usa el formato de nombre de tipo de unidad. Si usas el FQIN o un nombre personalizado (del Registro de editores configurables), MCG no puede inferir el tipo. En estos casos, debes proporcionar data_source_message_types. Si el tipo no está en tu catálogo, también debes proporcionar su definición en descriptor_protos.
Ejemplo: Cómo definir una fuente de datos
En este ejemplo, se informa la velocidad del vehículo. Primero, consulta el catálogo de VSIDL para identificar el servicio que publica estos datos.
Con el catálogo de ejemplo del código base del SDV, identifica el servicio pertinente. De acuerdo con el formato de source_identifier, especifica el tipo de mensaje de Protobuf mcg.test.subpkg.speed_msg. Dado que la velocidad suele publicarse con frecuencia, usa sub_sampling_interval_ms para limitar las actualizaciones a un mensaje por segundo:
{ "name": "SpeedSource", "source_identifier": "mcg.test.subpkg.speed_msg", "connection_type": "SUBSCRIPTION", "sub_sampling_interval_ms": 1000 // Limit updates to 1 per second }
Define la lógica y el procesamiento
La lógica se controla con dos componentes que trabajan juntos: los activadores (concepto) definen cuándo sucede algo. Los agregadores (concepto) definen cómo se procesan los datos en función de esos activadores. Dado que las expresiones (concepto) son clave para las condiciones de activación y la lógica de agregación, en esta sección, primero, se describe cómo escribirlas.
Expresiones
Las expresiones te permiten definir cálculos y condiciones con una sintaxis legible. MCG compila estas cadenas en un formato ejecutable optimizado para la evaluación integrado en el dispositivo.
Las expresiones pueden expresar cálculos aritméticos, condiciones lógicas y comparaciones de datos. Para ver la sintaxis completa, incluidos los operadores y las funciones, consulta Sintaxis de expresiones.
Actualidad de los datos: Cuando una expresión accede a una fuente de datos, el comportamiento de recuperación depende del tipo de conexión:
SUBSCRIPTION: Usa el mensaje recibido por última vez que almacena en caché el servicio de Telemetría. (Nota: Si se configurasub_sampling_interval_ms, es posible que esto difiera del mensaje publicado más reciente).ON_DEMAND: Activa una llamada inmediata para recuperar el mensaje actualizado del servicio.
Restricciones de tipo
- Arrays: No se admite el acceso directo al índice de array (por ejemplo,
my_data_source.my_array[0]). - Seguridad de tipos: Asegúrate de comparar tipos compatibles (por ejemplo, no compares un campo de cadena con una lista de números enteros).
Ejemplo: Expresiones
El ejemplo necesita extraer el valor de velocidad para calcular su promedio. También necesita determinar si el vehículo está excediendo el límite de velocidad (más de 100 km/h) para el activador condicional. Puedes encontrar los nombres de los campos (en este caso, speed) en la definición del mensaje de protobuf que usa la fuente de datos. Las siguientes expresiones logran esto:
SpeedSource.speed: Recupera el valor del campospeedde la fuente de datosSpeedSource.SpeedSource.speed > 27.7: Se evalúa comotruesi la velocidad es superior a 27.7 m/s (aproximadamente 100 km/h).
Activadores: Define cuándo ocurren las acciones
Los activadores definen cuándo se ejecutan las acciones: evaluar un agregador, generar un informe o controlar el ciclo de vida de la recopilación. Agrega todos los activadores definidos al array triggers de nivel superior.
Campos de un objeto de activación (elemento de la lista triggers) |
|
|---|---|
name |
Es un identificador único para este activador en la configuración de métricas. |
periodicdataconditional |
Debes proporcionar exactamente uno de estos campos para definir el comportamiento. |
Activador de datos
Se activa cuando una fuente de datos SUBSCRIPTION proporciona un mensaje nuevo (concepto).
Campos del objeto data (en un activador) |
|
|---|---|
source_name |
Es el name del data_source que escucha este activador. |
Ejemplo: Activador de datos
En el ejemplo, actualiza el cálculo de la velocidad promedio cada vez que SpeedSource publica un mensaje nuevo. Este activador de datos se activa cada vez que sucede lo siguiente:
{ "name": "OnNewSpeed", "data": { "source_name": "SpeedSource" // Reference to the defined data source } }
Activador periódico
Se dispara a intervalos regulares (concepto).
Campos del objeto periodic (en un activador) |
|
|---|---|
period_ms |
Es un número no negativo que define el intervalo en milisegundos. |
Ejemplo: Activador periódico
En el ejemplo, se requiere un informe cada minuto. Este activador periódico se activa cada 60,000 ms para generar ese informe:
{ "name": "EveryMinute", "periodic": { "period_ms": 60000 // 60,000 ms = 60 seconds } }
Activador condicional
Se activan en función de la evaluación de una expresión (concepto). Requiere uno o más activadores principales para iniciar su evaluación. A menudo, se trata de un activador de datos para las fuentes de datos o los agregadores de la expresión, o bien un activador periódico para sondear los datos.
Campos del objeto conditional (en un activador) |
|
|---|---|
triggers |
Es un array que incluye, al menos, un nombre de activador principal. Cuando se activa un activador principal, el activador condicional evalúa la expresión. |
expression |
Es la expresión que se evaluará. Consulta Expresiones. |
condition_type |
Especifica cuándo se debe activar el disparador, según la evaluación de la expresión. |
Tipos de condiciones
El diccionario condition_type debe contener exactamente uno de los tipos de condición disponibles como clave. Para obtener más información, consulta Activadores condicionales.
Campos del objeto condition_type (mutuamente excluyentes) |
|
|---|---|
is_trueis_false |
Se activa cuando una expresión booleana se evalúa como true o false, respectivamente. |
rising_edge |
Si es numérico, se activa cuando aumenta su valor. Si la expresión es booleana, se activa cuando cambia de Puede contener un objeto |
falling_edge |
Si es numérico, se activa cuando su valor disminuye. Si la expresión es booleana, se activa cuando cambia de Puede contener un objeto |
all_changes |
Se activa cuando el resultado de la expresión es diferente de su valor anterior. Si se configuran opciones de borde, solo admite valores numéricos y booleanos. Puede contener |
Opciones de borde
Los objetos rising_options y falling_options tienen los siguientes campos. Si se proporciona, la transición correspondiente debe satisfacer el requisito de duración.
Las transiciones sin opciones especificadas se activan de inmediato.
| Campos para objetos de opción de borde | |
|---|---|
min_duration_ms |
Es un número no negativo (en milisegundos) que especifica cuánto tiempo debe mantenerse la condición en el nuevo estado antes de que se active el disparador. |
opcionalrequire_exact |
Booleano. Si es verdadero, todos los valores publicados durante la duración deben ser iguales para que se active el disparador. |
Ejemplo: Activador condicional
El siguiente activador usa opciones de borde. Se activa si la velocidad supera los 27.7 m/s y se mantiene alta durante al menos 5 segundos:
{ "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 } } } } }
Agregadores: Definen cómo se procesan los datos
Usa un agregador para el procesamiento de datos intermedio y con estado (concepto).
Define un agregador y agrégalo al array aggregators.
Un agregador transforma los datos y los pone a disposición de otros agregadores y de los informes.
Campos de un agregador (elemento de la lista aggregators) |
|
|---|---|
name |
Es una cadena definida por el usuario que identifica este agregador. Las expresiones pueden hacer referencia a este agregador por su nombre para acceder a sus resultados. |
trigger_names |
Es un array de uno o más nombres de activadores que hacen que se evalúe esta agregación. |
opcionalreset_on_get |
Es un valor booleano. El valor predeterminado es "false". Si es "true", el sistema restablece el estado de agregación después de que otro agregador, informe de métricas o activador condicional accede a su valor. |
message_builder |
Define los datos que se leerán, procesarán y agregarán. Luego, los campos del mensaje de salida se convierten en una fuente de datos para otros agregadores y para los informes. Utiliza field_assignments, y cada asignación define un campo en el mensaje de salida. |
Creador de mensajes
Un objeto message_builder define la estructura del mensaje de salida y la lógica de agregación que se usa para calcular sus campos. Se usa en los agregadores y en las configuraciones de informes.
Campos de un objeto message_builder (en el agregador o el informe) |
|
|---|---|
message_type |
Es el nombre completamente calificado del tipo de mensaje de protobuf para la salida. Si se omite, MCG crea un tipo de mensaje personalizado basado en los tipos de salida inferidos de field_assignments. Solo usa este método si el compilador de mensajes forma parte de un informe de métricas y tu informe debe coincidir con una definición de mensaje .proto específica y predefinida. |
field_assignments |
Es un array de objetos de definición de campos. Cada objeto especifica un campo en el mensaje de salida y la lógica para calcular su valor. |
Campos de un objeto de asignación de campo (elemento de la lista field_assignments) |
|||||||
|---|---|---|---|---|---|---|---|
field_name |
Es un nombre definido por el usuario para el campo. Identifica el valor específico dentro del objeto cuando se usa la notación de puntos en las expresiones (aggregator_name.field_name). |
||||||
aggregation |
Es un objeto que define cómo el sistema calcula el valor del campo con los siguientes campos:
|
||||||
Ejemplo: Agregador
En el ejemplo, calcula las estadísticas entre los informes de minutos. OnNewSpeed activa este agregador para calcular la velocidad promedio (avg), registrar las lecturas (count) y almacenar los últimos 5 valores de velocidad (vector). Establece reset_on_get en true. Esto restablece las estadísticas cada vez que MinuteReport las lee, lo que inicia una nueva ventana de recopilación para el agregador durante el próximo minuto:
{ "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 } } ] } }
Crear resultado
Para definir el resultado final de tu campaña de telemetría, agrega objetos al array report_configs (concepto). Estos parámetros de configuración determinan cómo se empaquetan los datos procesados y cuándo se generan. Puedes definir varias configuraciones de informes en una configuración de métricas para reutilizar componentes.
Puedes controlar la generación de informes con el campo trigger_names. Además, puedes usar report_initial para generar un informe de inmediato cuando se active la configuración y report_incomplete para generar un informe final cuando se interrumpa la recopilación de datos.
Nota: Para conectar el procesamiento con la salida, usa el tipo de agregación none (@type: "none") para leer los valores precalculados de un agregador. Dado que los informes suelen ser instantáneas sin estado, esto mantiene la lógica compleja con estado dentro de los agregadores y reserva los informes para el formato.
Campos de un objeto de configuración de informes (elemento de la lista report_configs) |
|
|---|---|
name |
Es un nombre único para el informe. Este nombre aparece en los metadatos del informe generado. |
trigger_names |
Es un array de nombres de activadores que hacen que el informe se genere y publique. |
message_builder |
Consulta Message builder para obtener más información. Define el contenido del informe. Las agregaciones solo se evalúan cuando se activa el informe. Por ejemplo, una agregación de vectores agrega un valor por informe, y una agregación de recuento refleja el número de informe. |
opcionalreport_incomplete(predeterminado: `false`) |
Un valor booleano. Si es "true", el sistema genera un informe final cuando se apaga o cuando finaliza la recopilación de datos, incluso si faltan datos. |
opcionalreport_initial(predeterminado: `false`) |
Un valor booleano. Si es "true", el sistema genera un informe inmediatamente cuando se activa la configuración de métricas. |
Ejemplo: Configuración de informes
Por último, define la configuración del informe para el ejemplo. Se activa con EveryMinute. Lee la velocidad promedio calculada y el recuento de lecturas de SpeedAggregator con una agregación de none, que pasa el valor previamente agregado al informe:
{ "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" } } ] } }
Campos de nivel superior
Además de los arrays data_sources, aggregators, triggers y report_configs, la descripción de una configuración de métricas requiere una referencia al catálogo de indicadores. También puedes incluir campos opcionales para asignar un UUID específico y administrar el ciclo de vida de la colección.
Establece el UUID
Cada MetricsConfig requiere un identificador único universal (UUID). Si proporcionas un existing_uuid, MCG lo usará. De lo contrario, crea uno aleatorio. Para garantizar la coherencia entre las implementaciones y las herramientas, especifica un existing_uuid.
La cadena debe ser un UUID válido con guiones que contenga solo letras minúsculas.
"existing_uuid": "a1a2a3a4-b1b2-c1c2-d1d2-d3d4d5d6d7d8",
Definiciones de indicadores
Para validar los nombres y tipos de indicadores, MCG requiere acceso a un catálogo de indicadores del vehículo. Es un archivo FileDescriptorSet de protobuf que contiene las definiciones de .proto de VSIDL (empaquetadas y subidas a MCG). Para obtener detalles sobre cómo crear y subir un catálogo, consulta Catálogos de señales de vehículos.
Especifica la versión del catálogo en el campo vs_version del objeto JSON:
"vs_version": "v1.0",
Define activadores del ciclo de vida
En el contexto de una campaña de telemetría, el ciclo de vida de un MetricsConfig determina cuándo se registran los datos. Mientras el sistema de administración de campañas implementa y activa la configuración en el dispositivo, puedes usar activadores de ciclo de vida para controlar con precisión cuándo se recopilan los datos dentro de esa implementación.
Esto te permite alinear la recopilación de datos con los patrones de uso del vehículo, como un "viaje" (IgnitionOn a IgnitionOff) o una "sesión de carga", sin necesidad de desactivar la configuración.
Control de sesión (iniciar/pausar): Usa
start_trigger_nameystop_trigger_namepara controlar cuándo se realiza la recopilación. Por ejemplo, para recopilar datos solo mientras el vehículo está en movimiento, usaIgnitionOncomo el activador de inicio yIgnitionOffcomo el activador de detención. La configuración permanece activa en el dispositivo, pero se "pausa" (deja de recopilar y procesar) de manera efectiva cuando se activa el disparador de detención y se reanuda solo cuando se vuelve a activar el disparador de inicio.Importante: Esto solo pausa la recopilación. No define ventanas lógicas, conjuntos de datos separados ni tiene ningún otro efecto secundario. Los valores del agregador no se restablecen cuando se pausa o se reanuda la recopilación.
Detección única (finalización): Usa
deactivate_trigger_namesi la configuración debe ejecutarse solo una vez (por ejemplo, para detectar la primera aparición de un código de falla específico) y, luego, desactivarse de forma permanente en ese dispositivo, incluso si la campaña técnicamente sigue activa.
Si no especificas ningún activador de ciclo de vida, la recopilación de datos comienza de inmediato cuando la campaña activa la configuración y continúa de forma continua hasta que finaliza la campaña.
| Campos de ciclo de vida de nivel superior (objeto raíz) | |
|---|---|
opcionalstart_trigger_name |
Es el nombre de un activador que inicia la sesión de recopilación. Se puede configurar sin stop_trigger_name. |
opcionalstop_trigger_name |
Nombre de un activador que pausa la sesión de recopilación (por ejemplo, cuando el vehículo está detenido). Si se establece, también se debe establecer start_trigger_name. |
opcionaldeactivate_trigger_name |
Es el nombre de un activador que finaliza y desactiva por completo el objeto `MetricsConfig`. |
Avanzado: Definiciones de .proto personalizadas
En dos casos principales, vs_version por sí solo no es suficiente para que MCG comprenda todos los tipos de mensajes en la descripción de una configuración de métricas:
- Falla en la inferencia de tipos: Como se explica en el formato de
source_identifier, MCG no puede inferir el tipo cuandosource_identifierusa el FQIN o un nombre personalizado. - Mensajes personalizados: La descripción de la configuración de métricas usa mensajes de protobuf que no se encuentran en el catálogo de VSIDL especificado en
vs_version. Esto sucede cuando se configuramessage_typeen unmessage_builderpara un formato de informe personalizado.
En estos casos, usa data_source_message_types para ayudar a MCG a inferir tipos y descriptor_protos para proporcionar definiciones de mensajes.
data_source_message_types
Asigna la cadena source_identifier a su tipo de mensaje de protobuf completamente calificado.
La clave en data_source_message_types debe coincidir con el valor de source_identifier de la entrada data_sources:
"data_source_message_types": {
"MyCustomSpeedService": "com.sdv.example.SampleMessage"
}
descriptor_protos
Proporciona definiciones para cualquier tipo de mensaje que se use en data_source_message_types o message_builder que no se encuentre en el vs_version configurado.
Pasa un descriptorpb.FileDescriptorSet codificado en base64 en el array descriptor_protos. Se genera a partir de archivos .proto con el compilador de Protobuf protoc.
"descriptor_protos": [
"Cu8BCiZtY2cvdGVzdGRhdGEvbWF4YXZnY3..." // Base64 string
]
Ejemplo: Descripción de la configuración completa
En las secciones anteriores, se definen todos los componentes del ejemplo: generar un informe cada minuto con la velocidad promedio del vehículo observada durante ese minuto.
Los componentes son los siguientes:
- Una fuente de datos (
SpeedSource) para obtener datos de velocidad hasta una vez por segundo - Es un activador de datos (
OnNewSpeed) que se activa cuandoSpeedSourceenvía datos. - Un activador periódico (
EveryMinute) que se activa cada 60 segundos. - Un agregador (
SpeedAggregator) que usaOnNewSpeedpara calcular la velocidad promedio, contar las lecturas y almacenar los valores recientes, y que se restablece cuando se lee. - Es una configuración de informes (
MinuteReport) que usaEveryMinutepara activar un informe que contiene la velocidad promedio y el recuento deSpeedAggregator. - Campos de nivel superior (
existing_uuid,vs_version) para identificar la configuración de las métricas y especificar qué catálogo de VSIDL se usará para las definiciones de los indicadores.
Cuando se combinan, estas partes forman la descripción completa de una configuración de métricas:
{ "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" } } ] } } ] }
Plantilla de referencia
Para obtener la definición de la API, consulta la referencia de la API de MCG.
En las siguientes secciones, se proporciona una referencia completa de la descripción de una configuración de métricas. Úsala como guía para crear tu propia descripción de una configuración de métricas.
Campos de nivel superior
{
"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
}
Entrada: Fuentes de datos y agregadores
{
"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
}
}
]
}
}
]
}
Lógica y procesamiento: activadores
{
"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 }
}
}
}
}
]
}
Salida: Configuraciones de informes
{
"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"
}
}
]
}
}
]
}
Sintaxis de expresiones
| Categoría | Sintaxis | Descripción |
|---|---|---|
| Acceso a los datos | source_namesource_name.fieldsource_name.field.subfield |
Accede al mensaje completo desde una fuente de datos o un agregador. Accede a un campo específico del mensaje (incluidos los campos anidados). |
| Aritmética | +, -, *, /, % y ** |
Operación matemática estándar. ** es la potenciación. |
| Lógicos | &&, ||, !, ^ |
AND, OR, NOT y XOR. |
| Relacional | ==, !=, <, <=, > y >= |
== y != funcionan en todos los tipos. Otros requieren números. |
| Lista | contains(list, item)doesnotcontain(list, item)alleq(list, value) |
Opera en vectores (arrays). alleq(list, value) devuelve true si todos los elementos de list son iguales a value. |
| Funciones | timestamp(clock_type) |
Hora actual en nanosegundos.clock_type: REALTIME_CLOCK oMONOTONIC_TIME_SINCE_BOOT_OR_RESUME |
abs(n) |
Valor absoluto | |
floor(n), round(n), ceil(n) |
Funciones de redondeo | |
| Orden de las operaciones | () |
Agrupación estándar para la precedencia |