Formato JSON de la solicitud de generación de la configuración de métricas

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:

  1. Especifica las fuentes de datos: Define de dónde provienen tus datos.
  2. Define la lógica y el procesamiento: Configura reglas para determinar cuándo recopilar datos y cómo procesarlos.
  3. Crear salida: Empaqueta los datos procesados en un mensaje final.
  4. 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.

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).
opcional
configuration

Solo para el registro de publicadores configurable y la RPC Objeto para configurar la fuente de datos con los siguientes campos:

type_url Es el FQN del mensaje .proto de la configuración.
value_json,
value_textproto,
o value
Es la carga útil en formato JSON, textproto o base64.
Campos para el tipo de conexión SUBSCRIPTION
opcional
sub_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.
Opcional
fetch_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 configura sub_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 campo speed de la fuente de datos SpeedSource.
  • SpeedSource.speed > 27.7: Se evalúa como true si 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.
periodic
data
conditional
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_true

is_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 false a true.

Puede contener un objeto rising_options (consulta Opciones de borde).

falling_edge

Si es numérico, se activa cuando su valor disminuye. Si la expresión es booleana, se activa cuando cambia de true a false.

Puede contener un objeto falling_options (consulta Opciones de borde).

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 rising_options, falling_options o ambos (consulta Opciones de borde).

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.
opcional
require_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.
opcional
reset_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:

@type Es la función de agregación.

  • avg, min, max, sum, stddev: Son estadísticas matemáticas estándar.
  • count: Cuenta cuántas veces se activó este agregador.
  • delta: Diferencia entre el valor actual y el anterior.
  • vector: Crea una lista de valores (búfer de anillo).
  • none: Pasa el valor sin procesar.
expression Es la expresión de entrada para la agregación. Obligatorio para todos los tipos de agregación, excepto count.
max_length Solo para @type: "vector". Es un número entero opcional que limita el tamaño del vector y crea un búfer de anillo.

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.
opcional
report_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.
opcional
report_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_name y stop_trigger_name para controlar cuándo se realiza la recopilación. Por ejemplo, para recopilar datos solo mientras el vehículo está en movimiento, usa IgnitionOn como el activador de inicio y IgnitionOff como 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_name si 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)
opcional
start_trigger_name
Es el nombre de un activador que inicia la sesión de recopilación. Se puede configurar sin stop_trigger_name.
opcional
stop_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.
opcional
deactivate_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:

  1. Falla en la inferencia de tipos: Como se explica en el formato de source_identifier, MCG no puede inferir el tipo cuando source_identifier usa el FQIN o un nombre personalizado.
  2. 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 configura message_type en un message_builder para 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 cuando SpeedSource envía datos.
  • Un activador periódico (EveryMinute) que se activa cada 60 segundos.
  • Un agregador (SpeedAggregator) que usa OnNewSpeed para 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 usa EveryMinute para activar un informe que contiene la velocidad promedio y el recuento de SpeedAggregator.
  • 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_name
source_name.field
source_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 o
MONOTONIC_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