En esta guía, se detalla el formato de solicitud JSON para el
extremo /api/v1/generate_metrics_config de la herramienta Generador de configuración de métricas (MCG). Este formato te permite definir una campaña de telemetría, que especifica 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) de MetricsConfig. Este mensaje MetricsConfig
es el formato binario que ejecuta el servicio de telemetría integrado en el dispositivo
para publicar 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 escribir una descripción de la 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 resultado: 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 integran todos los componentes. Crea un informe que calcula la velocidad promedio de los vehículos cada minuto. 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 de informe de métricas (MinuteReport) para empaquetar el resultado. Los ejemplos de las secciones expandibles se basan en esta situación.
Especifica las 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
CreateSubscriptionoGetLatestMessage.Publicadores basados en el registro de publicadores configurable: Los datos están disponibles si la aplicación se registra con la interfaz de Binder de Android
IConfigurablePublisherRegistryo la biblioteca de registro de publicadores configurable del SDK de Telemetry.
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 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 pedido (para obtener más detalles, consulta la configuración de fuentes de datos). |
||||
opcionalconfiguration |
Solo RPC y Configurable Publisher Registry. Un objeto para configurar la fuente de datos con los siguientes campos:
|
||||
Campos para el tipo de conexión SUBSCRIPTION |
|||||
opcionalsub_sampling_interval_ms |
Solo Pub/Sub. Es un número entero no negativo (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 cuando se establece 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 las configuraciones de métricas para obtener una descripción general.
MCG infiere el tipo de mensaje de protobuf 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 publicadores configurable), 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: Define 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 muestra en la base de código de 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. Debido a 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 funcionan 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. Debido a 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 por humanos. MCG compila estas cadenas en un formato ejecutable optimizado para la evaluación integrada en el dispositivo.
Las expresiones pueden representar 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.
Actualización 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 último mensaje recibido que almacenó en caché el servicio de telemetría. (Nota: Si se establecesub_sampling_interval_ms, esto puede diferir del mensaje publicado más reciente absoluto).ON_DEMAND: Activa una llamada inmediata para recuperar el mensaje nuevo del servicio.
Restricciones de tipo
- Arrays: No se admite el acceso directo al índice de arrays (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
En el ejemplo, se debe extraer el valor de velocidad para calcular su
promedio. También debe determinar si el vehículo excede 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: Definen cuándo se producen 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 activador (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 de 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 publique un mensaje nuevo. Este activador de datos se activa cada vez que eso sucede:
{ "name": "OnNewSpeed", "data": { "source_name": "SpeedSource" // Reference to the defined data source } }
Activador periódico
Se activa en un intervalo regular (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 activa según la evaluación de una expresión (concepto). Requiere uno o más activadores superiores para iniciar su evaluación. Suele ser un activador de datos para las fuentes de datos o los agregadores de la expresión, o un activador periódico para sondear datos.
Campos del objeto conditional (en un activador) |
|
|---|---|
triggers |
Es un array con al menos un nombre de activador superior. Cuando se activa un activador superior, 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 activador, 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 las opciones de borde, solo se admiten 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 cumplir con el requisito de duración.
Las transiciones sin opciones especificadas se activan de inmediato.
| Campos para los objetos de opciones 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 estado nuevo antes de que se active el activador. |
opcionalrequire_exact |
Booleano. Si es verdadero, todos los valores publicados durante la duración deben ser los mismos para que se active el activador. |
Ejemplo: Activador condicional
En el siguiente activador, se usan 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 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 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 |
Booleano, predeterminado: `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, también, para los informes. Usa field_assignments, y cada asignación
define un campo en el mensaje de salida. |
Creador de mensaje
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 tanto en los agregadores
como 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 el resultado. Si
se omite, MCG crea un tipo de mensaje personalizado según los
tipos de salida inferidos de field_assignments. Usa esta opción solo si el compilador de mensajes forma parte de un informe de métricas y tu informe debe coincidir con una definición de mensaje de protobuf 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 campos (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), contar 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 siguiente 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 } } ] } }
Crea un resultado
Para definir el resultado final de tu campaña de telemetría, agrega objetos al
array report_configs (concepto). Estas configuraciones determinan cómo
se empaquetan los datos procesados y cuándo se generan. Puedes definir varios
parámetros de configuración de informes en un parámetro de 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 activa la configuración
y report_incomplete para generar un informe final cuando se interrumpe la recopilación
de datos.
Nota: Para conectar el procesamiento con el resultado, usa el tipo de agregación none
(@type: "none") para leer los valores calculados previamente de un agregador. Dado que
los informes suelen ser instantáneas sin estado, esto mantiene la lógica con estado compleja
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 se genere y publique el informe. |
message_builder |
Consulta Creador de mensajes para obtener más detalles. Esto define el contenido del informe. Las agregaciones se evalúan solo cuando se activa el informe. Por ejemplo, una agregación de vectores agrega un valor por informe, y una agregación de recuento refleja la cantidad de informes. |
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 de inmediato cuando se activa la configuración de las 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
none, que pasa el valor agregado previamente 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 usa. De lo contrario, se crea uno aleatorio. Para
obtener 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 de vehículos. Este es un protobuf FileDescriptorSet que contiene tus definiciones de VSIDL .proto
(empaquetadas y subidas a MCG). Para obtener detalles sobre cómo crear y
subir un catálogo, consulta Catálogos de indicadores 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" (de IgnitionOn a IgnitionOff) o una "sesión de carga", sin necesidad de desactivar la configuración.
Control de sesiones (inicio/pausa): Usa
start_trigger_nameystop_trigger_namepara controlar cuándo se produce la recopilación. Por ejemplo, para recopilar datos solo mientras el vehículo está en movimiento, usaIgnitionOncomo activador de inicio yIgnitionOffcomo activador de detención. La configuración permanece activa en el dispositivo, pero se "pausa" de manera efectiva (deja de recopilar y procesar) cuando se activa el activador de detención, y se reanuda solo cuando se vuelve a activar el activador de inicio.Importante: Esto solo detiene la recopilación. No define ventanas lógicas, conjuntos de datos independientes ni tiene ningún otro efecto secundario. Los valores del agregador no se restablecen cuando se pausa o 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 instancia de un código de error 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 comenzará de inmediato cuando la campaña active la configuración y continuará de forma ininterrumpida hasta que finalice 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 |
Es el 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 la `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 de inferencia de tipo: Como se explica en el formato
source_identifier, MCG no puede inferir el tipo cuandosource_identifierusa FQIN o un nombre personalizado. - Mensajes personalizados: La descripción de la configuración de las 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 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 esté en el vs_version configurado.
Pasa un descriptorpb.FileDescriptorSet codificado en base64 en el
array descriptor_protos. Genera esto 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 - 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, que se restablecen cuando se leen - 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 indicadores.
Cuando se combinan, estas piezas 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": "1cbec8e6-46f5-4649-9fa2-09f81bc93f8b", // 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 }
}
}
}
}
]
}
Resultado: parámetros de configuración 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 las 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 ** |
Matemáticas estándar. ** es la exponenciación. |
| Lógicos | &&, ||, !, ^ |
AND, OR, NOT, 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) |
Es la hora actual en microsegundos.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 |