visualização
Ainda estamos trabalhando nesse recurso, mas adoraríamos que você experimentasse!
Atualmente, esse recurso é fornecido como parte de um programa de visualização de acordo com nossas políticas de pré-lançamento.
Esquema
As definições de fluxo de trabalho são escritas em YAML. As chaves usam a convenção de nomenclatura camelCase.
nome (obrigatório)
- Tipo: String
- Formato: Deve estar em conformidade com a expressão regular
^[A-Za-z_][A-Za-z0-9_-]*$. - Comprimento máximo: 100
- Descrição: Os valores
namenão diferenciam maiúsculas de minúsculas. Por exemplo,ExampleWorkflow,exampleworkfloweEXAMPLEWORKFLOWsão todos considerados como representando a mesma definição de fluxo de trabalho.
Descrição (Opcional)
- Tipo: String
- Formato: Deve estar em conformidade com a expressão regular
^[A-Za-z0-9 _-]*$. - Comprimento máximo: 200
- Descrição: Um
descriptiondo fluxo de trabalho que explica seu propósito.
workflowInputs (Opcional)
- Tipo: Mapa de mapas
- Tamanho máximo: 100
- Descrição: Um mapa das entradas de fluxo de trabalho que o fluxo de trabalho aceita.
- Exemplo:
workflowInputs: myInput1: type: String myInput2: type: Number defaultValue: 42workflowInputs.<inputName>(Obrigatório)- Tipo: String (em conformidade com o padrão de segurança de expressão)
- Comprimento mínimo: 1
- Comprimento máximo: 50
- Descrição: O nome da entrada do fluxo de trabalho.
workflowInputs.<inputName>.type(Obrigatório)- Tipo: Enum (Booleano, Lista, Mapa, String, Inteiro, ponto flutuante)
- Descrição: O tipo de dados da entrada do fluxo de trabalho.
workflowInputs.<inputName>.defaultValue(Opcional)- Tipo: Qualquer; deve estar em conformidade com
type. - Descrição: O valor padrão para a entrada do fluxo de trabalho.
- Tipo: Qualquer; deve estar em conformidade com
Etapas (Obrigatórias)
- Tipo: matriz de mapas
- Descrição: Os passos a serem executados quando a definição do fluxo de trabalho for acionada. Deve haver pelo menos um passo.
Importante
Os passos serão executados na ordem em que são definidos na matriz
steps.Se uma ordem diferente for desejada, um "salto" pode ser realizado definindo a propriedade
steps[*].nextcom o nome da etapa desejada para a qual se deseja pular.steps[*].name(Obrigatório)- Tipo: String (em conformidade com o padrão seguro para expressões; não pode ser
end) - Comprimento máximo: 100
- Descrição: O nome da etapa a ser referenciada por
steps[*].next. Não podem ser as palavras-chave especiaisend,continueoubreak, pois estas são usadas para indicar uma etapa de término, uma continuação de um loop ou para sair de um loop.
- Tipo: String (em conformidade com o padrão seguro para expressões; não pode ser
steps[*].type(Obrigatório)- Tipo: String
- Descrição: O tipo da etapa, indicando o que a etapa faz quando executada. Consulte a seção Tipos de Etapas para ver as opções disponíveis.
steps[*].next(Opcional)Tipo: String (em conformidade com o padrão de segurança de expressão)
Descrição:
- O nome da próxima etapa a ser executada quando esta etapa for concluída com sucesso. A palavra-chave especial
endpode ser usada para indicar que esta etapa deve ser a última a ser executada. - Se
nextfor omitido, a entrada seguinte na matrizstepsda definição será usada como o próximo passo implícito. Caso não haja nenhuma entrada subsequente, o fluxo de trabalho será concluído.
- O nome da próxima etapa a ser executada quando esta etapa for concluída com sucesso. A palavra-chave especial
Tipos de etapas
Ação
Uma etapa que executa uma ação específica. Consulte o Catálogo de Ações para ver as opções disponíveis.
steps[*].action(Obrigatório)Tipo: String
Descrição: O nome completo da função de ação a ser executada. Deve seguir a seguinte convenção:
<company domain>.<category of work>.<action name in camelCase>Exemplo:
- Ação utilizando os serviços do New Relic (por exemplo, através do NerdGraph):
newrelic.dashboards.getDashboard - Ação usando o Slack:
slack.chat.postMessage
- Ação utilizando os serviços do New Relic (por exemplo, através do NerdGraph):
steps[*].version(Obrigatório)- Tipo: String
- Descrição: A versão da função de ação a ser executada.
steps[*].inputs(Opcional)Tipo: Mapa de valores (inclui expressões)
Descrição:
- Os parâmetros a serem passados para a função de ação. As entradas específicas aceitas são definidas por cada ação.
- As entradas podem usar expressões. Consulte a seção Cadeias de Expressões para obter detalhes.
Importante
Não devem ser passados dados sensíveis (nenhuma chave de API ou segredos, nenhum dado PII, PHI ou qualquer dado de identificação pessoal) como argumentos.
steps[*].inputs.selectors(Opcional)Tipo: lista de mapas no formato
namecomexpression.Descrição:
- A entrada
selectorspermite redefinir a saída para retornar apenas os elementos especificados. - A expressão pode ser usada. Consulte a seção Cadeias de Expressões para obter detalhes.
- A entrada
Exemplo
- No exemplo dado, estamos recebendo
pageUrlestatusDescriptioncomo resposta da ação http.get.
name: statusdescription: A workflow for checking the status of New Relic componentssteps:- name: query1type: actionaction: http.getversion: 1inputs:url: "https://status.newrelic.com/api/v2/status.json"selectors:- name: statusCodeexpression: '.statusCode'- name: pageUrlexpression: '.responseBody | fromjson | .page.url'- name: statusDescriptionexpression: '.responseBody | fromjson | .status.description'- name: logOutput1type: actionaction: newrelic.ingest.sendLogsversion: 1inputs:logs:- message: "status is '${{ .steps.query1.outputs.statusDescription }}' details at ${{ .steps.query1.outputs.pageUrl }}"- No exemplo dado, estamos recebendo
laço
Um laço irá iterar sobre uma coleção dada definida por in e criar variáveis de laço index e element para cada uma de suas iterações. Essas variáveis de loop são acessíveis dentro do loop apenas com a expressão ${{ .steps.<loopStepName>.loop.element }} ou ${{ .steps.<loopStepName>.loop.index }
Para mais detalhes, veja abaixo:
steps[*].for(Obrigatório)- Tipo: constante
- Descrição: Sinal de início de um loop
steps[*].in(Obrigatório)Tipo: string (expressão)
Descrição: Uma expressão que precisa ser avaliada como uma coleção de elementos.
steps[*].steps(Opcional)Descrição: Etapas a serem executadas em cada iteração do loop. Veja a definição das etapas acima.
Exemplo:
name: myWorkflowsteps:- name: loopSteptype: loopfor:in: "${{ [range(1; 5)] }}""steps:- name: step1type: actionaction: newrelic.ingest.sendLogsversion: 1inputs:logs:- message: "Loop: ${{ .steps.loopStep.loop.element }}"
trocar
Uma etapa que verifica várias condições e executa o primeiro ramo que resulta em verdadeiro.
Um switch pode conter qualquer número de elementos de condição em uma lista. O sistema verificará as condições em ordem e processará a primeira que for avaliada como verdadeira. Se nenhuma avaliação for verdadeira, o próximo passo será executado conforme definido em steps[*].next.
steps[*].switch(Obrigatório)- Tipo: matriz
- Descrição: Uma matriz de casos de alternância, especificando a lista ordenada de condições a serem avaliadas.
steps[*].switch[*].condition(Obrigatório)- Tipo: string (expressão)
- Descrição: O estado da caixa do interruptor. Se avaliada como verdadeira, a próxima etapa do caso será executada.
steps[*].switch[*].next(Obrigatório)- Tipo: string (em conformidade com o padrão de segurança de expressão)
- Descrição: O nome da etapa a ser executada se a condição do caso for avaliada como verdadeira. A palavra-chave especial "end" pode ser usada para indicar que esta etapa deve ser a última a ser executada.
- name: hasCompletedtype: switchswitch:- condition: ${{ .steps.waitForCompletion.outputs.automationExecutionStatus == "Failed" }}next: displayError- condition: ${{ .steps.waitForCompletion.outputs.automationExecutionStatus == "Success" }}next: displaySuccessnext: displayUnexpected
espere
Uma etapa que faz com que o fluxo de trabalho aguarde um determinado número de segundos antes de continuar. Ele também pode captar um ou mais sinais. Se nenhum sinal for recebido durante a espera, o processo prosseguirá normalmente. Os sinais são definidos em uma lista. Cada sinal deve ter uma próxima etapa correspondente definida. O primeiro sinal a ser recebido será o processado. O valor recebido para o sinal será armazenado na saída da etapa de espera e poderá ser usado para processamento lógico em etapas posteriores.
Exemplo:
name: waitSignalExampleworkflowInputs:steps:- name: waitSteptype: waitseconds: 300signals: [{name: 'mySignalName', next: 'firstStep'}]- name: endSteptype: actionaction: newrelic.ingest.sendLogsversion: 1inputs:logs:- message: "didn't get signal"next: end- name: firstSteptype: actionaction: newrelic.ingest.sendLogsversion: 1inputs:logs:- message: ${{ .steps.waitStep.outputs.signalInputs.myString }}steps[*].seconds(Obrigatório)- Tipo: número
- Descrição: O número de segundos a aguardar antes de continuar a execução do fluxo de trabalho.
steps[*].signals- Tipo: matriz
- Descrição: Os sinais que, quando recebidos, irão desviar o fluxo do programa.
steps[*].signals[*].name- Tipo: string
- Descrição: O nome do sinal a ser monitorado.
steps[*].signals[*].next- Tipo: string
- Descrição: O passo a ser executado se o sinal especificado for recebido.
Tipos Compartilhados
Cadeias de expressões
Diversas propriedades aceitam valores de string com expressões incorporadas que são avaliadas durante a execução do fluxo de trabalho, permitindo que valores dinâmicos sejam usados dentro das definições do fluxo de trabalho. As cadeias de expressões podem conter uma ou várias expressões, cada uma delas delimitada por chaves duplas. O conteúdo entre chaves é avaliado usando jq.
O jq oferece a capacidade de acessar e manipular valores de diversas maneiras. Por exemplo, o comprimento de uma string de entrada de fluxo de trabalho pode ser obtido da seguinte forma: ${{ .workflowInputs.myString | length }}
Para construir e testar expressões JQ, esta ferramenta pode ser utilizada.
Propriedades de expressão
Diversas propriedades podem ser acessadas por meio de expressões. Essas propriedades residem em um objeto de "escopo", portanto, as expressões devem começar com um ponto (.) para acessar essas propriedades do objeto de escopo.
Os imóveis disponíveis são:
workflowInputs- Objeto contendo as entradas passadas para o fluxo de trabalho no início.- Exemplo:
${{ .workflowInputs.myInput }}
- Exemplo:
steps- objeto contendo uma propriedade para cada etapa do fluxo de trabalhosteps.<stepName>- objeto contendo propriedades para uma etapa específicasteps.<stepName>.outputs- Objeto contendo propriedades de resultado, específicas para a etapa/ação.- Exemplo:
${{ .steps.myStep.outputs.myResult }}
- Exemplo:
Resultados da avaliação da expressão
Uma única expressão jq pode resultar em qualquer tipo JSON, mas é importante notar que o resultado final de uma string de expressão completa dependerá do conteúdo da string (se houver) que a envolve.
Se toda uma string de expressão consistir em uma única expressão, ela será avaliada de acordo com o resultado da expressão jq, mantendo o tipo JSON do resultado. Por exemplo, se um fluxo de trabalho receber uma matriz como entrada, a string ${{ .workflowInputs.myArray }} será avaliada como uma matriz. Isso pode ser útil para transmitir dados complexos dentro de um fluxo de trabalho.
Se a expressão contiver conteúdo além de uma única expressão, ela será avaliada como uma string resultante. Por exemplo, isso ocorre quando uma expressão tem conteúdo antes/depois dela ou se a string contém várias expressões. Cada expressão dentro da string é avaliada e convertida em uma representação em string.
Exemplo:
Para os exemplos a seguir, suponha que myArray tenha o valor [1, 2, 3].
string de expressão | Dados de resultados | Tipo de resultado |
|---|---|---|
| [1, 2, 3] | matriz de números |
| 3 | número |
| verdadeiro | boleano |
| "A entrada não está vazia: verdadeiro" | corda |
| "tem comprimento 3" | corda |
Padrão seguro para expressões
As propriedades que podem ser usadas em expressões devem estar em conformidade com a seguinte expressão regular: ^[A-Za-z_][A-Za-z0-9_]*$
Referências secretas
Os valores secretos podem ser usados em ações por meio de strings de referência que especificam o nome de um segredo a ser pesquisado no Serviço de Segredos. Para referenciar um segredo em uma definição de fluxo de trabalho, use a seguinte sintaxe:
${{ :secrets:<SECRET_NAME> }}para um segredo que não está em umnamespace${{ :secrets:<NAMESPACE>:<SECRET_NAME> }}para um segredo em umnamespace
Uma string de expressão pode conter uma combinação de referências secretas e expressões JQ e/ou múltiplas referências secretas.
Exemplos:
steps: - name: bearer_auth type: action action: http.post inputs: headers: Authorization: Bearer ${{ :secrets:<SECRET_NAME> }}Exemplos
- Olá Mundo
name: helloWorlddescription: 'A hello world workflow'
workflowInputs: name: type: String defaultValue: World required: false validations: - type: maxLength errorMessage: "name must be at most 100 characters" length: 100 slackTokenSecret: type: String defaultValue: "${{ :secrets:SLACK_TOKEN }}" slackChannel: type: String defaultValue: my-channel validations: - type: regex errorMessage: "A slack channel name must be lowercase and can only contain letters, numbers, and hyphens" pattern: "^[a-z0-9\\-]+$" required: true
steps: - name: init1 type: assign inputs: greeting: Hello ${{ .workflowInputs.name }}
- name: logName type: action action: newrelic.ingest.sendLogs version: 1 inputs: logs: - message: ${{ .steps.init1.outputs.greeting }}
- name: waiting1 type: wait seconds: 1
- name: queryForLog type: action action: newrelic.nrdb.query version: 1 inputs: query: >- FROM Log SELECT * WHERE message LIKE '${{ .steps.init1.outputs.greeting }}'
- name: checkResult type: switch switch: - condition: ${{ .steps.queryForLog.outputs.results | length > 0 }} next: FoundMessage
- name: waitingMessage type: action action: slack.chat.postMessage version: 1 inputs: channel: ${{ .workflowInputs.slackChannel }} text: Waiting for log message... token: ${{ .workflowInputs.slackTokenSecret }} next: waiting1
- name: FoundMessage type: action action: slack.chat.postMessage version: 1 inputs: channel: ${{ .workflowInputs.slackChannel }} text: Found message! ${{ .steps.queryForLog.outputs.results[0].message }} token: ${{ .workflowInputs.slackTokenSecret }}