Formato JSON della richiesta di generazione della configurazione delle metriche

Questa guida descrive in dettaglio il formato della richiesta JSON per l'endpoint /api/v1/generate_metrics_config dello strumento Generatore di configurazione delle metriche (MCG). Questo formato ti consente di definire una campagna di telemetria, specificando la raccolta dei dati, l'elaborazione sul dispositivo e la generazione di report, in una struttura leggibile.

Lo strumento MCG convalida questo oggetto JSON, verificando la presenza di problemi come mancata corrispondenza dei tipi, dipendenze circolari o riferimenti non definiti, quindi lo compila in un messaggio di buffer di protocollo (protobuf) MetricsConfig. Questo messaggio MetricsConfig è il formato binario che il servizio di telemetria sul dispositivo esegue per pubblicare la campagna.

Prerequisiti: devi avere familiarità con gli schemi JSON, protobuf e le strutture di dati di base. Per una panoramica concettuale, consulta Concetti relativi alla configurazione delle metriche.

Come scrivere una descrizione della configurazione

Per progettare una campagna di raccolta delle metriche, segui questo flusso logico:

  1. Specifica le origini dati: definisci la provenienza dei dati.
  2. Definisci la logica e l'elaborazione: configura le regole per quando raccogliere i dati e come elaborarli.
  3. Crea output: raggruppa i dati elaborati in un messaggio finale.
  4. Campi di primo livello: aggiungi campi di primo livello come UUID, definizioni degli indicatori e controllo del ciclo di vita.

Esempio: report sulla velocità media

Questa guida utilizza un esempio per mostrare come si combinano tutti i componenti. Crea un report che calcola la velocità media del veicolo ogni minuto. Definisce un'origine dati (SpeedSource) per raccogliere i dati sulla velocità, trigger (OnNewSpeed, EveryMinute) per controllare il flusso di esecuzione, un aggregatore (SpeedAggregator) per calcolare la media e una configurazione del report sulle metriche (MinuteReport) per creare il pacchetto del risultato. Gli esempi nelle sezioni espandibili si basano su questo scenario.

Specificare le origini dati

La telemetria supporta la raccolta di dati dai servizi SDV (tramite il middleware SDV) e dagli editori basati sul registro degli editori configurabile.

Per utilizzare i dati in SDV, definisci un'origine dati (concetto) e aggiungila all'array data_sources.

Campi di un oggetto di origine dati (elemento nell'elenco data_sources)
name Una stringa definita dall'utente che identifica questa origine dati all'interno della configurazione delle metriche.
source_identifier L'identificatore utilizzato per rilevare il servizio. Per maggiori dettagli, vedi Formato source_identifier.
connection_type SUBSCRIPTION per uno stream di dati continuo (obbligatorio per gli attivatori di dati) o ON_DEMAND per il recupero on demand (per maggiori dettagli, consulta la configurazione delle origini dati).
facoltativo
configuration

Solo RPC e Configurable Publisher Registry.Un oggetto per configurare l'origine dati con i seguenti campi:

type_url Il nome di dominio completo del messaggio protobuf della configurazione.
value_json,
value_textproto,
o value
Il payload in formato JSON, textproto o base64.
Campi per il tipo di connessione SUBSCRIPTION
facoltativo
sub_sampling_interval_ms
Solo Pub/Sub.Un numero intero non negativo (millisecondi) per limitare la frequenza dei messaggi specificando l'intervallo minimo tra i messaggi.
facoltativo
fetch_last_message
(valore predefinito: false)
Solo Pub/Sub. Booleano. Se true, recupera l'ultimo messaggio al momento della connessione.

Non tutte le opzioni sono disponibili per tutti i tipi di origini dati. Per informazioni dettagliate, consulta la guida all'integrazione delle origini dati.

Formato di source_identifier

Il servizio di telemetria accetta più formati di identificatori di origine. Per una panoramica, consulta Definizione dell'origine dati nelle configurazioni delle metriche.

MCG deduce il tipo di messaggio protobuf da source_identifier solo se utilizza il formato del nome del tipo di unità. Se utilizzi FQIN o un nome personalizzato (dal Configurable Publisher Registry), MCG non può dedurre il tipo. In questi casi, devi fornire data_source_message_types. Se il tipo non è presente nel tuo catalogo, devi fornire anche la sua definizione in descriptor_protos.

Esempio: definizione di un'origine dati

Questo esempio riporta la velocità del veicolo. Per prima cosa, consulta il catalogo VSIDL per identificare il servizio che pubblica questi dati.

Utilizzando il catalogo di esempio nel codebase SDV, identifica il servizio pertinente. In linea con il formato di source_identifier, specifica il tipo di messaggio protobuf mcg.test.subpkg.speed_msg. Poiché la velocità viene pubblicata di frequente, utilizza sub_sampling_interval_ms per limitare gli aggiornamenti a un messaggio al secondo:

{
  "name": "SpeedSource",
  "source_identifier": "mcg.test.subpkg.speed_msg",
  "connection_type": "SUBSCRIPTION",
  "sub_sampling_interval_ms": 1000 // Limit updates to 1 per second
}

Definisci la logica e l'elaborazione

La logica viene gestita da due componenti che operano in sinergia: gli attivatori (concetto) definiscono quando si verifica un evento, mentre gli aggregatori (concetto) definiscono come vengono elaborati i dati in base a questi attivatori. Poiché le espressioni (concetto) sono fondamentali per le condizioni di attivazione e la logica di aggregazione, questa sezione descrive innanzitutto come scriverle.

Espressioni

Le espressioni ti consentono di definire calcoli e condizioni utilizzando una sintassi leggibile. MCG compila queste stringhe in un formato eseguibile ottimizzato per la valutazione sul dispositivo.

Le espressioni possono esprimere calcoli aritmetici, condizioni logiche e confronti tra dati. Per la sintassi completa, inclusi operatori e funzioni, consulta Sintassi delle espressioni.

Aggiornamento dei dati:quando un'espressione accede a un'origine dati, il comportamento di recupero dipende dal tipo di connessione:

  • SUBSCRIPTION: utilizza l'ultimo messaggio ricevuto memorizzato nella cache dal servizio di telemetria. (Nota: se è impostato sub_sampling_interval_ms, questo valore potrebbe differire dall'ultimo messaggio pubblicato in assoluto.)
  • ON_DEMAND: attiva una chiamata immediata per recuperare il messaggio aggiornato dal servizio.

Vincoli di tipo

  • Array:l'accesso diretto all'indice dell'array (ad esempio, my_data_source.my_array[0]) non è supportato.
  • Sicurezza dei tipi:assicurati di confrontare tipi compatibili (ad esempio, non confrontare un campo stringa con un elenco di numeri interi).

Esempio: espressioni

L'esempio deve estrarre il valore della velocità per calcolarne la media. Deve anche determinare se il veicolo sta superando il limite di velocità (oltre 100 km/h) per l'attivatore condizionale. Puoi trovare i nomi dei campi (in questo caso speed) nella definizione del messaggio protobuf utilizzata dall'origine dati. Le seguenti espressioni raggiungono questo obiettivo:

  • SpeedSource.speed: recupera il valore del campo speed dall'origine dati SpeedSource.
  • SpeedSource.speed > 27.7: restituisce true se la velocità è superiore a 27,7 m/s (circa 100 km/h).

Trigger: definisci quando si verificano le azioni

Gli attivatori definiscono quando vengono eseguite le azioni: valutando un aggregatore, generando un report o controllando il ciclo di vita della raccolta. Aggiungi tutti i trigger definiti all'array triggers di primo livello.

Campi di un oggetto trigger (elemento nell'elenco triggers)
name Un identificatore univoco per questo trigger nella configurazione delle metriche.
periodic
data
conditional
Devi fornire esattamente uno di questi campi per definire il comportamento.

Trigger dati

Si attiva quando un'origine dati SUBSCRIPTION fornisce un nuovo messaggio (concetto).

Campi dell'oggetto data (in un trigger)
source_name Il name di data_source che questo trigger ascolta.

Esempio: trigger dati

Nell'esempio, aggiorna il calcolo della velocità media ogni volta che SpeedSource pubblica un nuovo messaggio. Questo trigger dati si attiva ogni volta che si verifica quanto segue:

{
  "name": "OnNewSpeed",
  "data": {
    "source_name": "SpeedSource" // Reference to the defined data source
  }
}

Trigger periodico

Viene attivato a intervalli regolari (concetto).

Campi dell'oggetto periodic (in un trigger)
period_ms Un numero non negativo che definisce l'intervallo in millisecondi.

Esempio: trigger periodico

L'esempio richiede un report ogni minuto. Questo trigger periodico viene attivato ogni 60.000 ms per generare il report:

{
  "name": "EveryMinute",
  "periodic": {
    "period_ms": 60000 // 60,000 ms = 60 seconds
  }
}

Trigger condizionale

Viene attivato in base alla valutazione di un'espressione (concetto). Richiede uno o più trigger genitore per iniziare la valutazione. Spesso si tratta di un trigger di dati per le origini dati o gli aggregatori nell'espressione oppure di un trigger periodico per eseguire il polling dei dati.

Campi dell'oggetto conditional (in un trigger)
triggers Un array con almeno un nome di trigger principale. Quando si attiva un attivatore principale, l'attivatore condizionale valuta l'espressione.
expression L'espressione da valutare. Vedi Espressioni.
condition_type Specifica quando deve essere attivato il trigger, in base alla valutazione dell'espressione.
Tipi di condizione

Il dizionario condition_type deve contenere esattamente uno dei tipi di condizione disponibili come chiave. Per saperne di più, consulta Trigger condizionali.

Campi dell'oggetto condition_type (si escludono a vicenda)
is_true

is_false
Viene attivato quando un'espressione booleana restituisce true o false, rispettivamente.
rising_edge

Se è numerico, viene attivato quando il suo valore aumenta. Se l'espressione è booleana, viene attivato quando passa da false a true.

Può contenere un oggetto rising_options (vedi Opzioni bordo).

falling_edge

Se è numerico, viene attivato quando il suo valore diminuisce. Se l'espressione è booleana, viene attivata quando cambia da true a false.

Può contenere un oggetto falling_options (vedi Opzioni bordo).

all_changes

Viene attivato quando il risultato dell'espressione è diverso dal valore precedente. Se sono impostate opzioni di limite, supporta solo valori numerici e booleani.

Può contenere rising_options, falling_options o entrambi (vedi Opzioni bordo).

Opzioni per il bordo

Gli oggetti rising_options e falling_options hanno i seguenti campi. Se fornita, la transizione corrispondente deve soddisfare il requisito di durata. Le transizioni senza opzioni specificate vengono attivate immediatamente.

Campi per gli oggetti delle opzioni di bordo
min_duration_ms Un numero non negativo (in millisecondi) che specifica per quanto tempo la condizione deve rimanere nel nuovo stato prima che l'attivatore si attivi.
facoltativo
require_exact
Booleano. Se è vero, tutti i valori pubblicati durante la durata devono essere uguali per l'attivazione del trigger.

Esempio: trigger condizionale

Il seguente trigger utilizza le opzioni perimetrali. Si attiva se la velocità supera i 27,7 m/s e rimane elevata per almeno 5 secondi:

{
  "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
        }
      }
    }
  }
}

Aggregatori: definisci come vengono trattati i dati

Utilizza un aggregatore per l'elaborazione dei dati intermedi con stato (concetto). Definisci un aggregatore e aggiungilo all'array aggregators.

Un aggregatore trasforma i dati e li rende disponibili ad altri aggregatori e report.

Campi di un aggregatore (elemento nell'elenco aggregators)
name Una stringa definita dall'utente che identifica questo aggregatore. Le espressioni possono fare riferimento a questo aggregatore per nome per accedere ai suoi risultati.
trigger_names Un array di uno o più nomi di trigger che causano la valutazione di questa aggregazione.
facoltativo
reset_on_get
Booleano, valore predefinito: `false`. Se `true`, il sistema reimposta lo stato di aggregazione dopo che il suo valore è stato accessibile da un altro aggregatore, report sulle metriche o trigger condizionale.
message_builder Definisce i dati da leggere, elaborare e aggregare. I campi del messaggio di output diventano quindi un'origine dati per altri aggregatori e report. Utilizza field_assignments, con ogni assegnazione che definisce un campo nel messaggio di output.

Generatore di messaggi

Un oggetto message_builder definisce la struttura del messaggio di output e la logica di aggregazione utilizzata per calcolare i relativi campi. Viene utilizzato sia negli aggregatori che nelle configurazioni dei report.

Campi di un oggetto message_builder (in aggregatore o report)
message_type Il nome completo del tipo di messaggio protobuf per l'output. Se omesso, MCG crea un tipo di messaggio personalizzato in base ai tipi di output dedotti field_assignments. Utilizza questa opzione solo se il generatore di messaggi fa parte di un report sulle metriche e il report deve corrispondere a una definizione di messaggio protobuf specifica e predefinita.
field_assignments Un array di oggetti di definizione dei campi. Ogni oggetto specifica un campo nel messaggio di output e la logica per calcolarne il valore.
Campi di un oggetto di assegnazione dei campi (elemento nell'elenco field_assignments)
field_name Un nome definito dall'utente per il campo. Identifica il valore specifico all'interno dell'oggetto quando si utilizza la notazione con il punto nelle espressioni (aggregator_name.field_name).
aggregation

Un oggetto che definisce il modo in cui il sistema calcola il valore del campo con i seguenti campi:

@type La funzione di aggregazione.

  • avg, min, max, sum, stddev: statistiche matematiche standard.
  • count: conta il numero di volte in cui questo aggregatore è stato attivato.
  • delta: differenza tra il valore attuale e quello precedente.
  • vector: crea un elenco di valori (buffer circolare).
  • none: passa il valore non elaborato.
expression L'espressione di input per l'aggregazione. Obbligatorio per tutti i tipi di aggregazione, ad eccezione di count.
max_length Solo per @type: "vector". Un numero intero facoltativo che limita la dimensione del vettore, creando un buffer circolare.

Esempio: Aggregator

Per l'esempio, calcola le statistiche tra i report al minuto. Questo aggregatore viene attivato da OnNewSpeed per calcolare la velocità media (avg), conteggiare le letture (count) e memorizzare gli ultimi 5 valori di velocità (vector). Imposta reset_on_get su true. In questo modo, le statistiche vengono reimpostate ogni volta che MinuteReport le legge, avviando una nuova finestra di raccolta per l'aggregatore per il minuto successivo:

{
  "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 output

Per definire l'output finale della campagna di telemetria, aggiungi oggetti all'array report_configs (concetto). Queste configurazioni determinano il modo in cui i dati elaborati vengono pacchettizzati e quando vengono generati. Puoi definire più configurazioni dei report in una configurazione delle metriche per riutilizzare i componenti.

Controlli la generazione dei report utilizzando il campo trigger_names. Inoltre, puoi utilizzare report_initial per generare un report immediatamente quando la configurazione si attiva e report_incomplete per generare un report finale quando la raccolta dei dati viene interrotta.

Nota:per collegare l'elaborazione all'output, utilizza il tipo di aggregazione none (@type: "none") per leggere i valori precalcolati da un aggregatore. Poiché i report sono in genere snapshot senza stato, questa operazione mantiene la logica stateful complessa all'interno degli aggregatori e riserva i report alla formattazione.

Campi di un oggetto di configurazione del report (elemento nell'elenco report_configs)
name Un nome univoco per il report. Questo nome viene visualizzato nei metadati del report generato.
trigger_names Un array di nomi di trigger che causano la generazione e la pubblicazione del report.
message_builder Per maggiori dettagli, consulta Generatore di messaggi. Definisce i contenuti del report. Le aggregazioni vengono valutate solo quando viene attivato il report. Ad esempio, un'aggregazione vettoriale aggiunge un valore per report, mentre un'aggregazione di conteggio rispecchia il numero del report.
facoltativo
report_incomplete
(impostazione predefinita: `false`)
Un valore booleano. Se `true`, il sistema genera un report finale all'arresto o al termine della raccolta dei dati, anche se i dati sono mancanti.
facoltativo
report_initial
(impostazione predefinita: `false`)
Un valore booleano. Se `true`, il sistema genera un report immediatamente quando la configurazione delle metriche viene attivata.

Esempio: configurazione del report

Infine, definisci la configurazione del report per l'esempio. Viene attivato da EveryMinute. Legge la velocità media calcolata e il conteggio delle letture da SpeedAggregator utilizzando un'aggregazione none, che passa il valore pre-aggregato al report:

{
  "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"
        }
      }
    ]
  }
}

Campi di primo livello

Oltre agli array data_sources, aggregators, triggers e report_configs, la descrizione di una configurazione delle metriche richiede un riferimento al catalogo dei segnali. Puoi anche includere campi facoltativi per assegnare un UUID specifico e gestire il ciclo di vita della raccolta.

Imposta UUID

Ogni MetricsConfig richiede un identificatore univoco universale (UUID). Se fornisci un existing_uuid, MCG lo utilizza. In caso contrario, ne crea uno casuale. Per garantire la coerenza tra deployment e strumenti, specifica un existing_uuid.

La stringa deve essere un UUID valido con trattini contenente solo lettere minuscole.

"existing_uuid": "a1a2a3a4-b1b2-c1c2-d1d2-d3d4d5d6d7d8",

Definizioni degli indicatori

Per convalidare i nomi e i tipi di indicatori, MCG richiede l'accesso a un catalogo di indicatori del veicolo. Si tratta di un file protobuf FileDescriptorSet contenente le definizioni VSIDL .proto (compresse e caricate su MCG). Per informazioni dettagliate sulla creazione e sul caricamento di un catalogo, consulta Cataloghi di indicatori del veicolo.

Specifica la versione del catalogo nel campo vs_version dell'oggetto JSON:

"vs_version": "v1.0",

Definisci i trigger del ciclo di vita

Nel contesto di una campagna di telemetria, il ciclo di vita di un MetricsConfig determina quando i dati vengono effettivamente registrati. Mentre il sistema di gestione delle campagne esegue il deployment e attiva la configurazione sul dispositivo, puoi utilizzare i trigger del ciclo di vita per controllare con precisione quando vengono raccolti i dati all'interno di questo deployment.

In questo modo puoi allineare la raccolta dei dati ai pattern di utilizzo del veicolo, ad esempio un "Viaggio" (da IgnitionOn a IgnitionOff) o una "Sessione di ricarica", senza dover disattivare la configurazione.

  • Controllo sessione (avvio/pausa): utilizza start_trigger_name e stop_trigger_name per controllare quando avviene la raccolta. Ad esempio, per raccogliere dati solo mentre il veicolo è in movimento, utilizza IgnitionOn come trigger di avvio e IgnitionOff come trigger di arresto. La configurazione rimane attiva sul dispositivo, ma viene "messa in pausa" (interrompe la raccolta e l'elaborazione) quando viene attivato il trigger di interruzione e riprende solo quando viene attivato di nuovo il trigger di avvio.

    Importante:questa operazione mette in pausa la raccolta. Non definisce finestre logiche, set di dati separati o ha altri effetti collaterali. I valori dell'aggregatore non vengono reimpostati quando la raccolta viene sospesa o ripresa.

  • Rilevamento una tantum (fine): utilizza deactivate_trigger_name se la configurazione deve essere eseguita una sola volta (ad esempio, per rilevare la prima occorrenza di un codice di errore specifico) e poi disattivarsi definitivamente sul dispositivo, anche se la campagna è tecnicamente ancora attiva.

Se non specifichi trigger del ciclo di vita, la raccolta dei dati inizia immediatamente quando la configurazione viene attivata dalla campagna e continua ininterrottamente fino al termine della campagna.

Campi del ciclo di vita di primo livello (oggetto radice)
facoltativo
start_trigger_name
Il nome di un trigger che avvia la sessione di raccolta. Può essere impostato senza stop_trigger_name.
facoltativo
stop_trigger_name
Il nome di un trigger che mette in pausa la sessione di raccolta (ad esempio, quando il veicolo è fermo). Se impostato, deve essere impostato anche start_trigger_name.
facoltativo
deactivate_trigger_name
Il nome di un trigger che finalizza e disattiva completamente `MetricsConfig`.

Avanzate: definizioni proto personalizzate

In due casi principali, vs_version da solo non è sufficiente per consentire a MCG di comprendere tutti i tipi di messaggi nella descrizione di una configurazione delle metriche:

  1. Errore di inferenza del tipo:come spiegato nel source_identifier formato, MCG non può dedurre il tipo quando source_identifier utilizza FQIN o un nome personalizzato.
  2. Messaggi personalizzati:la descrizione della configurazione delle metriche utilizza messaggi protobuf che non si trovano nel catalogo VSIDL specificato in vs_version. Ciò si verifica quando imposti message_type in un message_builder per un formato di report personalizzato.

In questi casi, utilizza data_source_message_types per aiutare MCG a dedurre i tipi e descriptor_protos per fornire le definizioni dei messaggi.

data_source_message_types

Mappa la stringa source_identifier al tipo di messaggio protobuf completo. La chiave in data_source_message_types deve corrispondere al valore source_identifier della voce data_sources:

"data_source_message_types": {
  "MyCustomSpeedService": "com.sdv.example.SampleMessage"
}

descriptor_protos

Fornisci le definizioni per tutti i tipi di messaggio utilizzati in data_source_message_types o message_builder che non sono presenti in vs_version configurato.

Trasmetti un descriptorpb.FileDescriptorSet con codifica Base64 nell'array descriptor_protos. Genera questo file dai file .proto utilizzando il compilatore Protobuf protoc.

"descriptor_protos": [
  "Cu8BCiZtY2cvdGVzdGRhdGEvbWF4YXZnY3..." // Base64 string
]

Esempio: descrizione completa della configurazione

Le sezioni precedenti definiscono tutti i componenti dell'esempio: generazione di un report ogni minuto con la velocità media del veicolo osservata durante quel minuto.

I componenti sono:

  • Un'origine dati (SpeedSource) per ottenere i dati sulla velocità fino a una volta al secondo.
  • Un trigger dati (OnNewSpeed) che si attiva quando SpeedSource invia dati.
  • Un trigger periodico (EveryMinute) che viene attivato ogni 60 secondi.
  • Un aggregatore (SpeedAggregator) che utilizza OnNewSpeed per calcolare la velocità media, conteggiare le letture e memorizzare i valori recenti, reimpostando i valori quando vengono letti.
  • Una configurazione di report (MinuteReport) che utilizza EveryMinute per attivare un report contenente la velocità media e il conteggio di SpeedAggregator.
  • Campi di primo livello (existing_uuid, vs_version) per identificare la configurazione delle metriche e specificare quale catalogo VSIDL utilizzare per le definizioni dei segnali.

Se combinati, questi elementi formano la descrizione completa di una configurazione delle metriche:

{
  "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"
            }
          }
        ]
      }
    }
  ]
}

Modello di riferimento

Per la definizione dell'API, consulta il riferimento API MCG.

Le sezioni seguenti forniscono un riferimento completo alla descrizione di una configurazione delle metriche. Utilizzalo come guida per creare la tua descrizione di una configurazione delle metriche.

Campi di primo livello

{
  "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
}

Input: origini dati e aggregatori

{
  "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
            }
          }
        ]
      }
    }
  ]
}

Logica ed elaborazione: trigger

{
  "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 }
          }
        }
      }
    }
  ]
}

Output: configurazioni dei report

{
  "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"
            }
          }
        ]
      }
    }
  ]
}

Sintassi delle espressioni

Categoria Sintassi Descrizione
Accesso ai dati source_name
source_name.field
source_name.field.subfield
Accedere al messaggio completo da un'origine dati o da un aggregatore
Accedere a un campo specifico del messaggio (inclusi i campi nidificati)
Aritmetica +, -, *, /, %, ** Matematica standard. ** è l'elevamento a potenza.
Logico &&, ||, !, ^ AND, OR, NOT, XOR.
Relazionale ==, !=, <, <=, >, >= == e != funzionano su tutti i tipi. Altri richiedono numeri.
Elenca contains(list, item)
doesnotcontain(list, item)
alleq(list, value)
Opera su vettori (array). alleq(list, value) restituisce true se tutti gli elementi di list sono uguali a value.
Funzioni timestamp(clock_type) Ora attuale in nanosecondi.
clock_type: REALTIME_CLOCK o
MONOTONIC_TIME_SINCE_BOOT_OR_RESUME
abs(n) Valore assoluto
floor(n), round(n) e ceil(n) Funzioni di arrotondamento
Ordine delle operazioni () Raggruppamento standard per la precedenza