Neste documento, você aprenderá como configurar sua visualização personalizada e o que está no arquivo nr1.json
da sua visualização. Você saberá como modificá-lo e como usá-lo para tornar sua visualização mais flexível e reutilizável.
Edite os metadados da sua visualização
O arquivo nr1.json
é um arquivo de metadados que fica em seu diretório de visualização e se parece com isto:
{ "schemaType": "VISUALIZATION", "id": "fun-visualization", "displayName": "FunVisualization", "description": "", "configuration": []}
Ele contém estas chaves de nível superior:
schemaType
: todos os itens do Nerdpack possuemnr1.json
arquivos de metadados. OschemaType
descreve o esquema do item. Para todas as visualizações,schemaType
éVISUALIZATION
.id
: o identificador de string da sua visualização. Deve ser exclusivo em um determinado Nerdpack, mas não precisa ser exclusivo em todos os Nerdpacks.displayName
: o nome legível que o New Relic exibe em Custom Visualizations.description
: a descrição que o New Relic exibe em Custom Visualizations.configuration
: uma lista de propriedades configuráveis para sua visualização. Você pode editar essas propriedades na interface da web e seus valores são passados para o seu componente de visualização.
Declare as propriedades configuráveis da sua visualização
Para declarar as propriedades configuráveis da sua visualização, liste-as na chave configuration
no arquivo nr1.json
:
"configuration": [ { "name": "nrqlQueries", "title": "NRQL Queries", "type": "collection", "items": [ { "name": "accountId", "title": "Account ID", "description": "Account ID to be associated with the query", "type": "number" }, { "name": "query", "title": "Query", "description": "NRQL query for visualization", "type": "nrql" } ] }, { "name": "fill", "title": "Fill color", "description": "A fill color to override the default fill color", "type": "string" }, { "name": "stroke", "title": "Stroke color", "description": "A stroke color to override the default stroke color", "type": "string" }]
Neste exemplo, nrqlQueries
é uma coleção de objetos de consulta. Cada objeto de consulta consiste em um accountId
e um query
. Como uma coleção, você pode ter vários objetos de consulta nesta visualização. fill
e stroke
são strings que definem uma cor que você pode usar ao renderizar a visualização.
Este é um exemplo de resultados configuration
nos seguintes campos da interface de configuração da visualização:
Observe o + ao lado de NRQL Queries, que você pode usar para adicionar objetos de consulta à coleção. Você também pode remover consultas passando o mouse sobre elas e clicando em -, se tiver mais de uma. Observe também a dica de ferramenta fornecida para a maioria dos campos. Cada dica de ferramenta na interface corresponde ao description
de seu campo, se houver.
No seu código React, você pode acessar os valores destes campos nas props do seu componente de visualização:
export default class MyCustomVisualization extends React.Component { render() { const { nrqlQueries, stroke, fill } = this.props; return <div> <p>Fill color: { fill }</p> <p>Stroke color: { stroke }</p> <p>First query account ID: { nrqlQueries[0].accountId }</p> <p>First query: { nrqlQueries[0].query }</p> </div> }
Todos os objetos configuration
possuem as seguintes chaves opcionais:
name
: O nome da propriedade do componente Reacttitle
: O nome de exibição da interfacedescription
: uma descrição da dica de ferramenta
Todos os objetos configuration
requerem uma chave type
que faça referência ao tipo de dados do campo. Cada tipo de dados é único na forma como é configurado e apresentado.
boolean
Uma propriedade boolean
é renderizada na interface como uma alternância e representa um estado verdadeiro ou falso.
{ "schemaType": "VISUALIZATION", "id": "custom-viz", "displayName": "CustomViz", "description": "MyCustomViz", "configuration": [ { "name": "showLabels", "title": "Show labels", "description": "Toggles the visibility of the chart's labels.", "type": "boolean" } ]}
import React from 'react';import data from './data';import { RadialBarChart, RadialBar, Legend } from 'recharts';
export default class CustomVizVisualization extends React.Component { render() { const { showLabels } = this.props; const label = showLabels ? { fill: '#666' } : false
return ( <RadialBarChart width={1000} height={700} data={data} > <RadialBar label={label} background dataKey='val' /> <Legend layout='vertical' verticalAlign='middle' align="right" /> </RadialBarChart> ) }}
string
Uma propriedade string
é renderizada na interface como um campo de texto e representa uma sequência de caracteres.
{ "schemaType": "VISUALIZATION", "id": "custom-viz", "displayName": "CustomViz", "description": "MyCustomViz", "configuration": [ { "name": "title", "title": "Chart title", "description": "The chart's title.", "type": "string" } ]}
import React from 'react';import data from './data';import { HeadingText } from 'nr1';import { RadialBarChart, RadialBar, Legend, Label } from 'recharts';
export default class CustomVizVisualization extends React.Component { render() { const { title } = this.props;
return ( <div> <HeadingText className="chart-heading"> {title} </HeadingText> <RadialBarChart width={1000} height={700} data={data} > <RadialBar background dataKey='val' /> <Legend layout='vertical' verticalAlign='middle' align="right" /> </RadialBarChart> </div> ) }}
number
Uma propriedade number
é renderizada na interface como um campo de texto e representa um número. number
adereços recebem três chaves opcionais extras:
min
: O valor mínimo que o campo de texto pode assumirmax
: O valor máximo que o campo de texto pode assumirstep
: O intervalo entre valores válidos
Embora essas chaves estejam disponíveis, elas não são aplicadas. Eles são puramente para fins de interface do usuário.
{ "schemaType": "VISUALIZATION", "id": "custom-viz", "displayName": "CustomViz", "description": "MyCustomViz", "configuration": [ { "name": "iconSize", "title": "Icon size", "description": "The size of legend icons.", "type": "number" } ]}
import React from 'react';import data from './data';import { RadialBarChart, RadialBar, Legend } from 'recharts';
export default class CustomVizVisualization extends React.Component { render() { const { iconSize } = this.props;
return ( <RadialBarChart width={1000} height={700} data={data} > <RadialBar background dataKey='val' /> <Legend layout='vertical' verticalAlign='middle' align="right" iconSize={iconSize} /> </RadialBarChart> ) }}
json
Uma propriedade json
é renderizada na interface como uma caixa de texto e representa um objeto JSON.
{ "schemaType": "VISUALIZATION", "id": "custom-viz", "displayName": "CustomViz", "description": "MyCustomViz", "configuration": [ { "name": "data", "title": "Chart data", "description": "The data in the chart", "type": "json" } ]}
import React from 'react';import { RadialBarChart, RadialBar, Legend } from 'recharts';
export default class CustomVizVisualization extends React.Component { render() { const { data } = this.props;
return ( <RadialBarChart width={1000} height={700} data={JSON.parse(data)} > <RadialBar background dataKey='val' /> <Legend layout='vertical' verticalAlign='middle' align="right" /> </RadialBarChart> ) }}
enum
Uma propriedade enum
é renderizada na interface como um menu suspenso e representa uma lista predefinida de opções. Um enum
usa uma matriz de items
, cada uma com seu próprio title
e value
. title
de um item é o título de exibição da interface. Seu value
é o nome do componente React.
{ "schemaType": "VISUALIZATION", "id": "custom-viz", "displayName": "CustomViz", "description": "MyCustomViz", "configuration": [ { "name": "iconType", "title": "Icon shape", "description": "The shape of legend icons.", "type": "enum", "items": [ { "title": "square", "value": "square" }, { "title": "circle", "value": "circle" }, { "title": "diamond", "value": "diamond" }, { "title": "star", "value": "star" }, { "title": "triangle", "value": "triangle" } ] } ]}
import React from 'react';import data from './data';import { RadialBarChart, RadialBar, Legend } from 'recharts';
export default class CustomVizVisualization extends React.Component { render() { const { iconType } = this.props;
return ( <RadialBarChart width={1000} height={700} data={data} > <RadialBar background dataKey='val' /> <Legend layout='vertical' verticalAlign='middle' align="right" iconType={iconType} /> </RadialBarChart> ) }}
nrql
Uma propriedade nrql
é renderizada na interface como uma caixa de texto e representa uma consulta NRQL . Você pode usar o componente NrqlQuery
da biblioteca de componentes nr1
para consultar o banco de dados do New Relic. Talvez seja necessário transformar os dados para atender às necessidades da sua visualização.
{ "schemaType": "VISUALIZATION", "id": "custom-viz", "displayName": "CustomViz", "description": "MyCustomViz", "configuration": [ { "name": "query", "title": "Query", "description": "The query for chart data.", "type": "nrql" } ]}
import React from 'react';import inputData from './data';import { NrqlQuery } from 'nr1';import { RadialBarChart, RadialBar, Legend } from 'recharts';
export default class CustomVizVisualization extends React.Component {
transformData(rawData) { if (rawData) { return rawData.map((entry) => ({ "name": entry.metadata.name, "val": entry.data[0].y, "fill": entry.metadata.color })); } }
render() { const { query } = this.props;
return ( <NrqlQuery accountId={inputData.accountId} query={query} > {({ data }) => { return <RadialBarChart width={1000} height={700} data={this.transformData(data)} > <RadialBar background dataKey='val' /> <Legend layout='vertical' verticalAlign='middle' align="right" /> </RadialBarChart> }} </NrqlQuery> ) }}
Importante
Embora a propriedade NRQL possa aparecer em qualquer lugar da sua configuração, é altamente recomendável colocá-la dentro da coleção nrqlQueries e acompanhá-la com account-id
. Dessa forma, seríamos capazes de fornecer a melhor experiência de edição NRQL e outros recursos úteis (como filtragem dashboard ) prontos para uso.
{ "schemaType": "VISUALIZATION", "id": "custom-viz", "displayName": "CustomViz", "description": "MyCustomViz", "configuration": [ { "name": "nrqlQueries", "title": "NRQL Queries", "type": "collection", "items": [ { "name": "query", "title": "Query", "description": "NRQL query for visualization", "type": "nrql" }, { "name": "accountId", "title": "Account ID", "description": "Account ID to run query against", "type": "account-id" } ] } ]}
account-id
Uma propriedade account-id
é renderizada na interface como um menu suspenso e representa uma conta New Relic . No menu, você pode pesquisar e selecionar uma conta.
{ "schemaType": "VISUALIZATION", "id": "custom-viz", "displayName": "CustomViz", "description": "MyCustomViz", "configuration": [ { "name": "account", "title": "Account", "description": "Select the appropriate New Relic account", "type": "account-id" } ]}
import React from 'react';import { NrqlQuery } from 'nr1';import { RadialBarChart, RadialBar, Legend } from 'recharts';
export default class CustomVizVisualization extends React.Component {
transformData(rawData) { if (rawData) { return rawData.map((entry) => ({ "name": entry.metadata.name, "val": entry.data[0].y, "fill": entry.metadata.color })); } }
render() { const { account } = this.props; const query = "SELECT count(*) FROM Public_APICall FACET `http.method`"
return ( <NrqlQuery accountId={account} query={query} > {({ data }) => { return <RadialBarChart width={1000} height={700} data={this.transformData(data)} > <RadialBar background dataKey='val' /> <Legend layout='vertical' verticalAlign='middle' align="right" /> </RadialBarChart> }} </NrqlQuery> ) }}
namespace
Um namespace
agrupa propriedades na interface sob um único título. Um namespace possui items
que são acessados em código, por nome, como atributo da propriedade namespace .
{ "schemaType": "VISUALIZATION", "id": "custom-viz", "displayName": "CustomViz", "description": "MyCustomViz", "configuration": [ { "name": "legend", "title": "Legend", "type": "namespace", "items": [ { "name": "iconSize", "title": "Icon size", "description": "The size of legend icons.", "type": "number" }, { "name": "iconType", "title": "Icon shape", "description": "The shape of legend icons.", "type": "enum", "items": [ { "title": "square", "value": "square" }, { "title": "circle", "value": "circle" }, { "title": "diamond", "value": "diamond" }, { "title": "star", "value": "star" }, { "title": "triangle", "value": "triangle" } ] } ] } ]}
import React from 'react';import data from './data';import { RadialBarChart, RadialBar, Legend } from 'recharts';
export default class CustomVizVisualization extends React.Component { render() { const { legend } = this.props;
return ( <RadialBarChart width={1000} height={700} data={data} > <RadialBar background dataKey='val' /> <Legend layout='vertical' verticalAlign='middle' align="right" iconSize={legend.iconSize} iconType={legend.iconType} /> </RadialBarChart> ) }}
collection
Um collection
é um grupo de conjuntos de propriedades ou namespaces repetíveis sob um único título. Ao criar uma coleção, você especifica propriedades para os itens filho da coleção. Ao configurar uma coleção na interface, você pode aumentar ou diminuir a quantidade de itens filhos na coleção.
No código, você acessa a propriedade de coleção como uma matriz de itens.
{ "schemaType": "VISUALIZATION", "id": "custom-viz", "displayName": "CustomViz", "description": "MyCustomViz", "configuration": [ { "name": "data", "title": "Chart data", "type": "collection", "items": [ { "name": "name", "title": "Age group", "description": "The age range of the group.", "type": "string" }, { "name": "val", "title": "Amount", "description": "The amount of people in the age group.", "type": "number", "min": 0 }, { "name": "fill", "title": "Bar color", "description": "The color of the chart bar.", "type": "string" } ] } ]}
import React from 'react';import { RadialBarChart, RadialBar, Legend } from 'recharts';
export default class CustomVizVisualization extends React.Component { render() { const { data } = this.props;
return ( <RadialBarChart width={1000} height={700} data={data} > <RadialBar background dataKey='val' /> <Legend layout='vertical' verticalAlign='middle' align="right" /> </RadialBarChart> ) }}
Usar nr1.json
Você pode editar nr1.json
livremente, mas, diferentemente de index.js
sua visualização servida localmente requer uma reinicialização para ver suas alterações. Portanto, se você estiver exibindo sua visualização localmente, desmonte seu servidor local com CTRL+C
e ative-o novamente:
$nr1 nerdpack:serve
Se sua visualização já estiver publicada, você precisa atualizar a versão do seu Nerdpack em package.json
e publicar e assinar a nova versão:
$nr1 nerdpack:publish$nr1 nerdpack:subscribe