Dicas para criar consultas de API genéricas para gráficos de painel

As dicas para ajudá-lo a criar consultas de API genérica e gráficos de painel mais facilmente abrangem os requisitos de dados para tipos de gráficos específicos, o mapeamento de resultados para quando o JSON retornado não é uma matriz e títulos dinâmicos.

Formato de dados

As APIs que são chamadas devem retornar dados em um formato JSON específico para o painel ser capaz de ler os dados. APIs retornam uma matriz JSON (quando há vários resultados) ou um objeto JSON (quando há apenas um resultado). Os objetos JSON retornados são convertidos em uma matriz JSON contendo um elemento.

A maioria das APIs do IBM® QRadar® retornam dados em um formato que o painel pode processar Outras APIs, como APIs do app, podem exigir que você use o mapeamento de resultados do painel para extrair uma chave específica do objeto JSON retornado.

Requisitos de dados para gráficos tabulares

Para gráficos tabulares, as APIs devem retornar um objeto JSON (quando houver apenas um resultado) ou uma matriz JSON de elementos representando dados tabulares. Por exemplo:

[{
      "rowstring": "Thanksgiving eCard Emails Distributing Malware",
      "category": "Threat Activity",
      "relevance": "25%",
      "href": "/app/href"
    }, {
      "title": "PyXie - RAT Written In Python",
      "category": "Threat Activity",
      "relevance": "25%",
      "href": "/app/href"
    }, ...

Requisitos de dados para gráficos de pizza e gráficos de barras de série única

Para gráficos de pizza e gráficos de barras de série única, as APIs devem retornar um objeto JSON (quando houver apenas um resultado) ou uma matriz JSON que contenha pelo menos um rótulo e uma métrica numérica. Por exemplo:
[{
    "Country": "Europe",
    "Count": 97
  }, {
    "Country": "Middle East",
    "Count": 85
  }, {
    "Country": "North America",
    "Count": 83
  }, ...

Requisitos de dados para gráficos de séries temporais

Para gráficos de série temporal, as APIs devem retornar um objeto JSON (quando houver apenas um resultado) ou uma matriz JSON que contenha pelo menos uma métrica baseada em tempo usando um formato de data ou milissegundos válidos e uma ou várias métricas numéricas para plotar no eixo Y. Os dados devem ser solicitados por tempo. Por exemplo:

[{
    "date": "2020-02-18",
    "Phishing": 7.21,
    "C2": 82.67,
    "Malware": 272.05,
    "EarlyWarning": 448.32
  }, {
    "date": "2020-02-19",
    "Phishing": 7.47,
    "C2": 94.14,
    "Malware": 121.84,
    "EarlyWarning": 665.33
  }, {
    "date": "2020-02-20",
    "Phishing": 8.05,
    "C2": 92.35,
    "Malware": 120.71,
    "EarlyWarning": 736.9
  }, ...

Requisitos de dados para gráficos geográficos de dispersão

Gráficos geográficos de dispersão requerem um objeto JSON stringificado (isto é, um objeto que é convertido usando a função JSON.stringify() JavaScript ) contendo uma chave geo_json com coordenadas, e uma métrica numérica. Por exemplo:

[{
    "sourceIP": "81.12.213.121",
    "geoSource": "{\"geo_json\":{\"coordinates\":[44.4354,26.1033],\"type\":\"Point\"}}",
    "geoDest": "{\"geo_json\":{\"coordinates\":[1.0,38.0],\"type\":\"Point\"}}",
    "eventCount": 50
  }, {
    "sourceIP": "59.154.60.0",
    "geoSource": "{\"geo_json\":{\"coordinates\":[-33.494,143.2104],\"type\":\"Point\"}}",
    "geoDest": "{\"geo_json\":{\"coordinates\":[53.3472,-6.2439],\"type\":\"Point\"}}",
    "eventCount": 60
  }, { ...

Requisitos de dados para gráficos geográficos do Choropleth

Os gráficos geográficos do Coropleth requerem um objeto JSON stringificado (isto é, um objeto que é convertido usando a função JSON.stringify() JavaScript ) contendo uma chave country com o nome país / região ou o código ISO-3 do country/região e uma métrica numérica. Por exemplo:

[{
    "sourceIP": "81.12.213.121",
    "geoCountry": "{\"country\":{\"confidence\":null,\"name\":\"Romania\",\"iso_code\":\"ROU\",\"geo_id\":798549}}",
    "eventCount": 50
  }, {
    "sourceIP": "59.154.60.0",
    "geoCountry": "{\"country\":{\"confidence\":null,\"name\":\"Australia\",\"iso_code\":\"AUS\",\"geo_id\":2077456}}",
    "eventCount": 60
  }, { ...

Mapeamento de resultados

Se o objeto raiz no JSON retornado não for a matriz da qual você deseja criar gráfico, use o campo Mapeamento de resultados para definir qual chave contém os dados relevantes dos quais você deseja criar gráfico.

O mapeamento de resultados usa o operador JSON dot (.) para percorrer o documento, iniciando a partir do nó raiz. Por exemplo, no objeto JSON a seguir, os dados relevantes estão sob a chave items , que está sob o nó raiz table . Um mapeamento table.items é necessário para o painel para ler a matriz items e ignorar todas as outras chaves:

{
  "table": {
    "title": "Top 5 most relevant threats",
    "columns": [{
      "title": "Threat",
      "key": "title",
      "subkey": "category",
      "width": 75
    }, {
      "title": "X-Force Threat Score",
      "key": "relevance",
      "width": 0
    }],
    "items": [{
      "title": "Thanksgiving eCard Emails Distributing Malware",
      "category": "Threat Activity",
      "relevance": "25%",
      "href": "/app/href"
    }, {
      "title": "PyXie - RAT Written In Python",
      "category": "Threat Activity",
      "relevance": "25%",
      "href": "/app/href"
    }, { ...

Se o próprio objeto JSON retornado for uma matriz, como é o caso da maioria das APIs padrão do QRadar , nenhum mapeamento será necessário. Mas com apps QRadar , o JSON retornado pode ter um formato diferente.

Título dinâmico

Você pode substituir um nome de visualização usando um título dinâmico que descreve o estado atual dos dados. Por exemplo, um gráfico é intitulado "Atividade Maliciosa Mundial: < ameaç_name>", onde o nome da ameaça muda ao longo do tempo. Os títulos dinâmicos requerem uma chave title com o nome do título dinâmico, como mostrado no exemplo a seguir:

{
  "title": "Worldwide Malicious Activity: emotet",
  "items": [{
    "sourceIP": "81.12.213.121",
    "geoSource": "{\"geo_json\":{\"coordinates\":[44.4354,26.1033],\"type\":\"Point\"}}",
    "geoDest": "{\"geo_json\":{\"coordinates\":[1.0,38.0],\"type\":\"Point\"}}",
    "geoCountry": "{\"country\":{\"confidence\":null,\"name\":\"Romania\",\"iso_code\":\"ROU\",\"geo_id\":798549}}",
    "eventCount": 50
  }, { ...

Se a chave title estiver sob o nó raiz, use o campo Mapeamento de título. O mapeamento de título usa o operador JSON dot (.) para percorrer o documento, iniciando a partir do nó raiz. Por exemplo, se a chave title estiver sob um nó raiz table, você especificaria um mapeamento table.title.