Aperçu
Nous travaillons toujours sur cette fonctionnalité, mais nous aimerions que vous l'essayiez !
Cette fonctionnalité est actuellement fournie dans le cadre d'un programme d'aperçu conformément à nos politiques de pré-sortie.
Schéma
Les définitions de workflow sont écrites en YAML. Les clés utilisent une convention de nommage camelCase.
nom (obligatoire)
- Type: Chaîne de caractères
- Format: Doit être conforme à l'expression régulière
^[A-Za-z_][A-Za-z0-9_-]*$. - Longueur maximale: 100
- Description: Les valeurs
namene sont pas sensibles à la casse. Par exemple,ExampleWorkflow,exampleworkflow, etEXAMPLEWORKFLOWsont tous considérés comme représentant la même définition workflow.
description (facultatif)
- Type: Chaîne de caractères
- Format: Doit être conforme à l'expression régulière
^[A-Za-z0-9 _-]*$. - Longueur maximale: 200
- Description: Un
descriptiondu workflow qui explique son objectif.
workflowInputs (facultatif)
- Type: Carte des cartes
- Taille maximale: 100
- Description: Une carte des entrées workflow acceptées par workflow.
- Exemple:
workflowInputs: myInput1: type: String myInput2: type: Number defaultValue: 42workflowInputs.<inputName>(Obligatoire)- Type: Chaîne de caractères (conforme au modèle d'expression sûre)
- Longueur minimale: 1
- Longueur maximale: 50
- Description: Nom de l'entrée workflow.
workflowInputs.<inputName>.type(Obligatoire)- Type: Enum (Boolean, List, Map, String, Int, Float)
- Description: Type de données de l'entrée workflow.
workflowInputs.<inputName>.defaultValue(Facultatif)- Type: Tout ; doit être conforme à
type. - Description: Valeur par défaut de l'entrée workflow.
- Type: Tout ; doit être conforme à
étapes (obligatoires)
- Type: éventail de cartes
- Description: Étapes à effectuer lors de l'exécution de la définition workflow. Il doit y avoir au moins une étape.
Important
Les étapes s'exécuteront dans l'ordre où elles sont définies dans l'éventail
steps.Si un ordre différent est souhaité, un « saut » peut être effectué en définissant la propriété
steps[*].nextsur le nom de l'étape souhaitée vers laquelle sauter.steps[*].name(Obligatoire)- Type: Chaîne (conforme au modèle d'expression sûre; ne peut pas être
end) - Longueur maximale: 100
- Description: Le nom de l'étape à référencer par
steps[*].next. Il ne peut pas s'agir des mots clés spéciauxend,continue, oubreak, car ceux-ci sont utilisés pour indiquer une étape de terminaison, une continuation d'une boucle ou pour sortir d'une boucle.
- Type: Chaîne (conforme au modèle d'expression sûre; ne peut pas être
steps[*].type(Obligatoire)- Type: Chaîne de caractères
- Description: Le type d'étape, indiquant ce que fait l'étape lorsqu'elle est exécutée. Consultez la section « Types d'étapes » pour connaître les options disponibles.
steps[*].next(Facultatif)Type: Chaîne de caractères (conforme au modèle d'expression sûre)
Description:
- Nom de l'étape suivante à exécuter une fois cette étape terminée avec succès. Le mot-clé spécial
endpeut être utilisé pour indiquer que cette étape doit être la dernière à être exécutée. - Si
nextest omis, l'entrée suivante dans le éventailstepsde la définition sera utilisée comme étape suivante implicite. S'il n'y a pas d'entrée suivante, le workflow sera terminé.
- Nom de l'étape suivante à exécuter une fois cette étape terminée avec succès. Le mot-clé spécial
Types d'étapes
action
Une étape qui exécute une action spécifique. Consultez le catalogue des actions pour connaître les options disponibles.
steps[*].action(Obligatoire)Type: Chaîne de caractères
Description: Nom complet de la fonction d'action à exécuter. Elle devrait respecter la convention suivante :
<company domain>.<category of work>.<action name in camelCase>Exemple:
- Action utilisant les services New Relic (par exemple via NerdGraph) :
newrelic.dashboards.getDashboard - Action via Slack :
slack.chat.postMessage
- Action utilisant les services New Relic (par exemple via NerdGraph) :
steps[*].version(Obligatoire)- Type: Chaîne de caractères
- Description: Version de la fonction d'action à exécuter.
steps[*].inputs(Facultatif)Type: Carte de valeurs (incluant les expressions)
Description:
- Les données d'entrée à transmettre à la fonction d'action. Les entrées spécifiques acceptées sont définies par chaque action.
- Les entrées peuvent utiliser des expressions. Consultez la section « Chaînes d’expressions » pour plus de détails.
Important
Aucune donnée sensible (ni clé API ni secret, ni PII, ni PHI, ni aucune donnée permettant d'identifier une personne) ne doit être transmise en tant qu'arguments.
steps[*].inputs.selectors(Facultatif)Type: liste de maps sous la forme
nameavecexpression.Description:
- L'entrée
selectorspermet de redéfinir la sortie pour ne renvoyer que les éléments spécifiés. - L'expression peut être utilisée. Consultez la section « Chaînes d’expressions » pour plus de détails.
- L'entrée
Exemple
- Dans l'exemple donné, nous obtenons
pageUrletstatusDescriptioncomme réponse de l'action 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 }}"- Dans l'exemple donné, nous obtenons
boucle
Une boucle parcourra une collection donnée définie par in et créera des variables de boucle index et element pour chacune de ses itérations. Ces variables de boucle ne sont accessibles à l'intérieur de la boucle qu'avec l'expression ${{ .steps.<loopStepName>.loop.element }} ou ${{ .steps.<loopStepName>.loop.index }
Pour plus de détails, voir ci-dessous :
steps[*].for(Obligatoire)- Type: constante
- Description: Signal de démarrage d'une boucle
steps[*].in(Obligatoire)Type: chaîne (expression)
Description: Une expression qui doit être évaluée en une collection d'éléments.
steps[*].steps(Facultatif)Description: Étapes à exécuter à chaque itération de la boucle. Voir la définition des étapes ci-dessus.
Exemple:
name: myWorkflowsteps:- name: loopSteptype: loopfor:in: "${{ [range(1; 5)] }}""steps:- name: step1type: actionaction: newrelic.ingest.sendLogsversion: 1inputs:logs:- message: "Loop: ${{ .steps.loopStep.loop.element }}"
changer
Une étape qui vérifie diverses conditions et emprunte la première branche qui s'évalue à vrai.
Un commutateur peut contenir un nombre quelconque d'éléments de condition dans une liste. Il vérifiera les conditions dans l'ordre et traitera la première qui s'avère vraie. Si aucune condition n'est vraie, l'étape suivante sera exécutée conformément à la définition de steps[*].next.
steps[*].switch(Obligatoire)- Type: éventail
- Description: Un éventail de cas de commutation, spécifiant la liste ordonnée des conditions à évaluer.
steps[*].switch[*].condition(Obligatoire)- Type: chaîne (expression)
- Description: État du boîtier de l'interrupteur. Si la valeur est vraie, l'étape suivante du cas sera exécutée.
steps[*].switch[*].next(Obligatoire)- Type: chaîne de caractères (conforme au modèle d'expression sûre)
- Description: Nom de l'étape à exécuter si la condition du cas est vraie. Le mot-clé spécial « end » peut être utilisé pour indiquer que cette étape doit être la dernière à être exécutée.
- name: hasCompletedtype: switchswitch:- condition: ${{ .steps.waitForCompletion.outputs.automationExecutionStatus == "Failed" }}next: displayError- condition: ${{ .steps.waitForCompletion.outputs.automationExecutionStatus == "Success" }}next: displaySuccessnext: displayUnexpected
attendez
Une étape qui suspend l'exécution workflow pendant un certain nombre de secondes avant de se poursuivre. Il peut également capter un ou plusieurs signaux. Si aucun signal n'est reçu pendant l'attente, la procédure se déroulera normalement. Les signaux sont définis dans une liste. Chaque signal doit avoir une étape suivante correspondante définie. Le premier signal reçu est celui qui sera traité. La valeur reçue pour le signal sera stockée dans la sortie de l'étape d'attente et pourra être utilisée pour le traitement logique lors des étapes ultérieures.
Exemple:
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(Obligatoire)- Type: nombre
- Description: Nombre de secondes à attendre avant de poursuivre l'exécution workflow.
steps[*].signals- Type: éventail
- Description: Les signaux qui, lorsqu'ils sont reçus, modifient le flux du programme.
steps[*].signals[*].name- Type: chaîne de caractères
- Description: Le nom du signal à écouter.
steps[*].signals[*].next- Type: chaîne de caractères
- Description: Étape à exécuter si le signal spécifié est reçu.
Types partagés
chaînes d'expression
Plusieurs propriétés acceptent des valeurs de type chaîne contenant des expressions intégrées qui sont évaluées lors de l'exécution workflow, ce qui permet d'utiliser des valeurs dynamiques dans les définitions workflow. Les chaînes d'expression peuvent contenir une ou plusieurs expressions, chacune étant encadrée par des doubles accolades. Le contenu entre accolades est évalué à l'aide de jq.
jq offre la possibilité d'accéder aux valeurs et de les manipuler de multiples façons. Par exemple, la longueur d'une chaîne d'entrée workflow pourrait être obtenue comme suit : ${{ .workflowInputs.myString | length }}
Cet outil permet de créer et de tester des expressions JQ.
propriétés d'expression
Un certain nombre de propriétés sont accessibles via des expressions. Ces propriétés résident dans un objet « portée », les expressions doivent donc commencer par un point (.) pour accéder à ces propriétés de l'objet portée.
Les propriétés disponibles sont :
workflowInputs- objet contenant les entrées transmises au workflow au démarrage.- Exemple:
${{ .workflowInputs.myInput }}
- Exemple:
steps- objet contenant une propriété pour chaque étape du workflowsteps.<stepName>- objet contenant les propriétés d'une étape spécifiquesteps.<stepName>.outputs- objet contenant les propriétés de résultat, spécifiques à l'étape/action.- Exemple:
${{ .steps.myStep.outputs.myResult }}
- Exemple:
Résultats de l'évaluation de l'expression
Une seule expression jq peut être évaluée à n'importe quel type JSON, mais il est important de noter que le résultat final d'une chaîne d'expression complète dépendra du contenu de la chaîne (le cas échéant) entourant la ou les expressions.
Si l'intégralité d'une chaîne d'expression se compose d'une seule expression, celle-ci sera évaluée comme le résultat de l'expression jq, en conservant le type JSON du résultat. Par exemple, si un workflow reçoit un éventail en entrée, la chaîne ${{ .workflowInputs.myArray }} sera évaluée comme un éventail. Cela peut s'avérer utile pour transmettre des données complexes au sein d'un workflow.
Si la chaîne d'expression contient un contenu autre qu'une expression unique, elle sera évaluée comme un résultat de type chaîne de caractères. Par exemple, cela se produit lorsqu'une expression est précédée ou suivie d'un contenu, ou si la chaîne contient plusieurs expressions. Chaque expression contenue dans la chaîne est évaluée et convertie en une représentation sous forme de chaîne de caractères.
Exemple:
Pour les exemples suivants, supposons que myArray ait une valeur de [1, 2, 3].
chaîne d'expression | Données de résultats | Type de résultat |
|---|---|---|
| [1, 2, 3] | éventail de nombres |
| 3 | nombre |
| vrai | booléen |
| "Le champ d'entrée n'est pas vide : vrai" | chaîne |
| " a une longueur de 3" | chaîne |
Modèle sans danger pour les expressions
Les propriétés utilisables dans les expressions doivent respecter l'expression régulière suivante : ^[A-Za-z_][A-Za-z0-9_]*$
Références secrètes
Les valeurs secrètes peuvent être utilisées dans les actions via des chaînes de référence qui spécifient le nom d'un secret à rechercher dans le service de secrets. Pour faire référence à un secret dans une définition workflow, utilisez la syntaxe suivante :
${{ :secrets:<SECRET_NAME> }}pour un secret pas dans unnamespace${{ :secrets:<NAMESPACE>:<SECRET_NAME> }}pour un secret dans unnamespace
Une chaîne d'expression peut contenir un mélange de références secrètes et d'expressions JQ et/ou plusieurs références secrètes.
Exemples :
steps: - name: bearer_auth type: action action: http.post inputs: headers: Authorization: Bearer ${{ :secrets:<SECRET_NAME> }}Exemples
- Bonjour le monde
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 }}