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 que o QRadar® Pulse possa 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 IBM® QRadar retorna dados em um formato que o QRadar Pulse pode processar. Outras APIs, como APIs de app, podem requerer que você use o mapeamento de resultados do QRadar Pulse para extrair uma chave específica do objeto JSON retornado
Requisitos de dados para gráficos tabulares
Para gráficos tabulares, APIs devem retornar ou um objeto JSON (quando há 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
[{
"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éries temporais, as APIs devem retornar ou um objeto JSON (quando há apenas um resultado) ou uma matriz JSON que contém pelo menos uma métrica baseada em tempo usando um formato de data ou milissegundos válido, e uma ou muitas 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 em sequência (ou seja, 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 de Chouopleth requerem um objeto JSON em sequência (ou seja, um objeto que é convertido usando a função JSON.stringify() JavaScript ) contendo uma chave country com o nome do país / região ou o código ISO-3 do país / 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 na chave items , que está sob o nó raiz table . Um mapeamento table.items é necessário para o QRadar Pulse 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
É possível 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 "World Malicious Activity: < ameaç_name>", em que 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.