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.
Propriétés du schéma
Propriété | Obligatoire ou facultatif | Type | Format | Contraintes | Description |
|---|---|---|---|---|---|
| Requis | Chaîne | Doit être conforme à l'expression régulière
| Longueur maximale : 100 | Les valeurs
ne respectent pas la casse. Par exemple,
,
et
sont tous considérés comme représentant la même définition de workflow. |
| Facultatif | Chaîne | Doit être conforme à l'expression régulière
| Longueur maximale : 200 | Une
du workflow décrivant le but du workflow. |
| Facultatif | Carte de cartes | Taille maximale : 100 | Une carte des entrées de workflow que le workflow accepte. Voir les propriétés détaillées ci-dessous. |
workflowInputs
Exemple:
workflowInputs: myInput1: type: String myInput2: type: Number defaultValue: 42workflowInputs.<inputName>(Obligatoire)- Type: Chaîne (conforme au modèle sécurisé pour les expressions)
- 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.
- Type: Enum (
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 à
workflowInputs.<inputName>.required(Facultatif)- Type: Booléen (
True,False). - Description: La valeur par défaut de ce champ est « True ».
- Type: Booléen (
workflowInputs.<inputName>.enumValues(Facultatif)- Type: Liste (
String). - Description: La valeur par défaut de ce champ est une liste vide
{}. Ceci est requis lorsque le type workflowInput est Enum.
- Type: Liste (
workflowInputs.<inputName>.validations(Facultatif)- Type: Tableau de cartes.
- Description: Les validations à effectuer sur les entrées de workflow fournies par l'utilisateur. Ceci est un champ facultatif. Les propriétés décrites ici sont présentes dans tous les types de validation. Les types de validation spécifiques prennent en charge des propriétés supplémentaires, comme indiqué dans la section Types de validation.
validations[*].type(Obligatoire)- Type: Chaîne de caractères
- Description: Le type de validation indiquant quelle validation aura lieu sur ce champ. Consultez Types de validation pour plus d'informations sur chaque type de validation.
validations[*].errorMessage(Obligatoire)- Type: Chaîne de caractères
- Description: Le message d'erreur que l'utilisateur souhaite obtenir lorsqu'une validation particulière échoue.
Exemple YAML pour les validations
name: calendar_demo
workflowInputs: timezone: type: String defaultValue: 'America/Los_Angeles' validations: - type: regex errorMessage: "The provided timezone is not correct" pattern: "^[A-Za-z]+\/[A-Za-z_]+(?:\/[A-Za-z_]+)?$"
- type: maxLength errorMessage: "Timezone length should be less than 100" length: 100
accountId: type: Int validations: - type: minIntValue errorMessage: "Account id should be greater than 100000" minValue: 100000 - type: maxIntValue errorMessage: "Account id should be less than 9999999" maxValue: 9999999
steps: - name: getCurrentTime type: action action: http.get version: 1 inputs: url: 'https://worldtimeapi.org/api/timezone/${{ .workflowInputs.timezone }}' selectors: - name: timezone expression: '.responseBody | fromjson.abbreviation' - name: datetime expression: '.responseBody | fromjson.datetime'Étapes
Propriété | Obligatoire ou facultatif | Type | Contraintes | Description |
|---|---|---|---|---|
| Requis | tableau de cartes | Les étapes à effectuer lors de l'exécution de la définition du workflow. Il doit y avoir au moins une étape. Les propriétés décrites ici sont présentes sur tous les types d'étapes. Des types d'étapes spécifiques prennent en charge des propriétés supplémentaires, comme décrit dans la section . |
Important
Les étapes s'exécutent dans l'ordre dans lequel elles sont définies dans le tableau steps. Si un ordre différent est souhaité, un jump peut être effectué en définissant la propriété steps[*].next sur le nom de l'étape souhaitée pour passer.
Propriétés d'étape courantes
Propriété | Obligatoire ou facultatif | Type | Format | Contraintes | Description |
|---|---|---|---|---|---|
| Requis | Chaîne | Doit être conforme au modèle sécurisé pour les expressions , ne peut pas être
. | Longueur maximale : 100 | Le nom de l'étape à référencer par
. Ne peut pas être les mots-clés spéciaux
,
ou
, car ceux-ci sont utilisés pour indiquer une étape de terminaison, une continuation d'une boucle ou pour sortir d'une boucle. |
| Requis | Chaîne | Le type de l'étape, indiquant ce que l'étape fait lors de l'exécution. Reportez-vous à ci-dessous pour les options disponibles. | ||
| Facultatif | Chaîne | Doit être conforme au modèle sécurisé d'expression | Le nom de l'étape suivante à exécuter lorsque cette étape se termine avec succès. Le mot-clé spécial end peut être utilisé pour indiquer que cette étape doit être la dernière à s'exécuter. Si
est omis, l'entrée suivante dans le tableau de définition
sera utilisée comme étape suivante implicite. S'il n'y a pas d'entrée suivante, le workflow sera terminé. | |
| Facultatif | Booléen | Le
est une option de configuration au sein d'une étape d'un workflow. Par défaut, faux. En définissant
sur
, le workflow garantit que toute erreur rencontrée lors de l'exécution de cette étape n'entraînera pas l'échec de l'ensemble du workflow. Au lieu de cela, le workflow continuera d'exécuter les étapes suivantes. |
Types d'étapes
Action
Une étape qui exécute une action spécifique. Reportez-vous au Catalogue d'actions pour 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.getDashboardAction via Slack :
slack.chat.postMessagesteps[*].version(Obligatoire)- Type: Chaîne de caractères
- Description: Version de la fonction d'action à exécuter.
steps[*].inputs(Facultatif)Type: Carte de valeurs (inclut 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 cartes sous la forme de
nameavecexpression.Description:
- L'entrée
selectorsvous permet de redéfinir la sortie pour ne renvoyer que les éléments spécifiés. - Les expressions peuvent être utilisées. Consultez la section Chaînes d'expression pour plus de détails.
- L'entrée
Exemple:
- Dans l'exemple donné, nous obtenons
timezoneetdatetimecomme réponse de l'action http.get.
name: calendar_demo
workflowInputs: timezone: type: String defaultValue: 'America/Los_Angeles' accountId: type: Int
steps: - name: getCurrentTime type: action action: http.get version: 1 inputs: url: 'https://worldtimeapi.org/api/timezone/${{ .workflowInputs.timezone }}' selectors: - name: timezone expression: '.responseBody | fromjson.abbreviation' - name: datetime expression: '.responseBody | fromjson.datetime'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 :
steps[*].for(Obligatoire)- Type: Constant
- 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: myWorkflow steps: - name: loopStep type: loop for: in: "${{ [range(1; 5)] }}" steps: - name: step1 type: action action: newrelic.ingest.sendLogs version: 1 inputs: logs: - message: "Loop: ${{ .steps.loopStep.loop.element }}"Switch
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
conditiondans une liste. Il vérifiera les conditions dans l'ordre et traitera la première qui s'évalue à vrai. Si aucune ne s'évalue à vrai, il exécutera son étapenextcomme défini danssteps[*].next.steps[*].switch(Obligatoire)- Type: Tableau
- 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: La condition du cas de commutateur. Si elle est évaluée à true, l'étape du cas
nextsera exécutée. - Consultez la section Chaînes d'expression pour plus de détails.
steps[*].switch[*].next(Obligatoire)- Type: Chaîne (conforme au modèle sécurisé pour les expressions)
- Description: Le nom de l'étape à exécuter si la condition du cas est évaluée à true. Le mot-clé spécial
endpeut être utilisé pour indiquer que cette étape doit être la dernière à s'exécuter.
- name: hasCompletedtype: switchswitch:- condition: ${{ .steps.waitForCompletion.outputs.automationExecutionStatus == "Failed" }}next: displayError- condition: ${{ .steps.waitForCompletion.outputs.automationExecutionStatus == "Success" }}next: displaySuccessnext: displayUnexpected
Attendez
Une étape qui met en pause l'exécution du workflow pendant un nombre spécifié de secondes avant de continuer.
L'étape d'attente peut également écouter un ou plusieurs signaux. Chaque signal doit avoir une étape suivante correspondante définie dans une liste. Si un signal est reçu pendant la période d'attente, le premier signal reçu sera traité et le workflow exécutera son étape suivante définie. Si aucun signal n'est reçu, le workflow continue normalement une fois la période d'attente terminée.
La valeur reçue d'un signal est stockée dans la sortie de l'étape d'attente et peut être utilisée dans les étapes suivantes pour la logique ou le traitement.
Exemple:
name: waitSignalExample workflowInputs: steps: - name: waitStep type: wait seconds: 300 signals: [{name: 'mySignalName', next: 'firstStep'}] - name: endStep type: action action: newrelic.instrumentation.log version: 1 inputs: message: "didn't get signal" next: end - name: firstStep type: action action: newrelic.instrumentation.log version: 1 inputs: 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: Tableau
- 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.
Attribuer
Une étape qui définit les variables à utiliser tout au long du workflow. Cette étape affecte des valeurs aux variables qui peuvent être référencées dans les étapes suivantes. En définissant toutes les variables au même endroit, ce type d'étape rend les workflows plus lisibles et optimisés.
Exemple de workflow:
name: sampleWorkflowWithAssign description: WorkflowAssignDemo
workflowInputs: initialValue: type: String anotherValue: type: Int
steps: - name: runAction type: action action: internal.http.post version: 1 inputs: url: 'http://localhost:8505/tasks/gc' # temporal-activity-worker-java service port selectors: - name: statusCode expression: '.statusCode' - name: responseBody expression: '.responseBody' - name: variableInitialization type: assign inputs: stringVar: "${{ .workflowInputs.initialValue }}" intVar: "${{ .workflowInputs.anotherValue }}" concatenationVar: "${{ .workflowInputs.initialValue }} - concatenated" booleanVar: true mapVar: key1: "value1" key2: "${{ .workflowInputs.initialValue }}" listVar: - "listItem1" - "${{ .workflowInputs.initialValue }}" - "${{ .workflowInputs.anotherValue }}" statusCode: ${{ .steps.runAction.outputs.statusCode }}
- name: wait type: wait seconds: 2
- name: logVariables type: action action: newrelic.ingest.sendLogs version: 1 inputs: logs: - message: "stringVar: ${{ .steps.variableInitialization.outputs.stringVar }}" - message: "intVar: ${{ .steps.variableInitialization.outputs.intVar }}" - message: "concatenationVar: ${{ .steps.variableInitialization.outputs.concatenationVar }}" - message: "booleanVar: ${{ .steps.variableInitialization.outputs.booleanVar }}" - message: "mapVar: ${{ .steps.variableInitialization.outputs.mapVar | tojson }}" - message: "listVar: ${{ .steps.variableInitialization.outputs.listVar | tojson }}" - message: "statusCode: ${{ .steps.variableInitialization.outputs.statusCode }}"steps[*].inputs(Obligatoire)- Type: Carte de valeurs (inclut les expressions)
- Description:
- Les entrées sont une carte des noms de variables et de leurs valeurs attribuées. Lorsque des références secrètes sont affectées à des variables, elles restent des références secrètes et ne sont pas converties en leurs valeurs réelles. Cependant, d'autres expressions (telles que les entrées de workflow) sont évaluées et converties en leurs valeurs réelles.
- Types d'entrée autorisés :
Integer,Double,Boolean,String,Array,Map
Types de validation
Type de validation | Propriété | Obligatoire ou facultatif | Type | Description |
|---|---|---|---|---|
|
| Requis | Chaîne | Valide la valeur d'entrée du workflow par rapport au modèle regex fourni. |
|
| Requis | Entier | Valide que la valeur d'entrée du workflow doit être inférieure à la valeur maximale fournie. |
|
| Requis | Entier | Valide que la valeur d'entrée du workflow doit être supérieure à la valeur minimale fournie. |
|
| Requis | Entier | Valide la longueur maximale des chaînes d'entrée de workflow et des collections (
). |
Types partagés
chaînes d'expression
Plusieurs propriétés acceptent des valeurs de chaîne avec des expressions intégrées qui sont évaluées lors de l'exécution du workflow, ce qui permet d'obtenir des valeurs dynamiques dans les définitions de workflow.
Les chaînes d'expression peuvent contenir une ou plusieurs expressions, chacune étant placée entre des accolades doubles. Le contenu entre les accolades est évalué à l'aide de jq, qui offre de puissantes capacités pour accéder aux valeurs et les utiliser.
Exemple:
Obtenir la longueur d'une chaîne d'entrée de workflow :
${{ .workflowInputs.myString | length }}
Pour valider et tester vos expressions, utilisez le JQ Playground.
propriétés d'expression
Un certain nombre de propriétés sont accessibles avec des expressions. Ces propriétés se trouvent dans un objet scope, les expressions doivent donc commencer par un point (.) pour accéder à ces propriétés de l'objet scope.
Les propriétés disponibles sont :
workflowInputs- Objet contenant les entrées passées au workflow au démarrage.
Exemple:
${{ .workflowInputs.myInput }}
steps- Objet contenant une propriété pour chaque étape du workflowsteps.<stepName>- Objet contenant des propriétés pour une étape spécifiquesteps.<stepName>.outputs- Objet contenant les propriétés de résultat, spécifiques à l'étape ou à l'action.
Exemple: ${{ .steps.myStep.outputs.myResult }}
Résultats de l'évaluation de l'expression
Une seule expression jq peut être évaluée à n'importe quel type JSON. Cependant, le résultat final d'une chaîne d'expression dépend de savoir si la chaîne contient uniquement l'expression ou du contenu supplémentaire.
Expression unique (conserve le type JSON):
Si une chaîne d'expression se compose d'une seule expression sans contenu environnant, elle est évaluée au résultat de l'expression jq tout en conservant son type JSON d'origine. Par exemple, ${{ .workflowInputs.myArray }} est évalué en un tableau. Ceci est utile pour passer des structures de données complexes dans un workflow.
Expressions multiples ou contenu mixte (convertit en chaîne):
Si une chaîne d'expression contient autre chose qu'une seule expression, elle est évaluée en un résultat de chaîne. Cela se produit lorsqu'une expression contient du contenu avant ou après elle, ou lorsque la chaîne contient plusieurs expressions en son sein. Chaque expression dans la chaîne est évaluée et convertie en une représentation de chaîne.
Important
Lorsqu'une expression jq est évaluée à null, un nœud null est renvoyé. Par exemple, l'expression ${{ .workflowInputs.missingInput }} renvoie null si missingInput n'est pas donné en entrée de workflow.
Exemple:
Supposons que myArray ait une valeur de [1, 2, 3].
chaîne d'expression | Données de résultats | Type de résultat |
|---|---|---|
|
| Tableau de nombres |
| 3 | Nombre |
| Vrai | Booléen |
|
| Chaîne |
|
| Chaîne |
Modèle sécurisé d'expression
Les propriétés qui peuvent être utilisées dans les expressions doivent être conformes à : ^[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${{ :secrets:<SCOPE>:<NAMESPACE>:<SECRET_NAME> }}pour un secret dans la portée et l'espace de noms. scope n'accepte queACCOUNTouORGANIZATIONpour le moment.
Une chaîne d'expression peut contenir un mélange de références secrètes et d'expressions JQ and/or plusieurs références secrètes.
Exemples:
steps: - name: mySecretStep type: action action: newrelic.instrumentation.log inputs: message: My message licenseKey: ${{ :secrets:<SECRET_NAME> }}steps: - name: bearer_auth type: action action: utils.http.post inputs: headers: Authorization: Bearer ${{ :secrets:<SECRET_NAME> }}Exemples
Démo de calendrier
Un exemple complet de workflow qui démontre plusieurs fonctionnalités de workflow, notamment les entrées de workflow, les actions HTTP, les sélecteurs, les étapes d'attente, les requêtes NRQL, les instructions switch et les notifications Slack.
name: calendar_demo
workflowInputs: timezone: type: String defaultValue: 'America/Los_Angeles' accountId: type: Int
steps: - name: getCurrentTime type: action action: http.get version: 1 inputs: url: 'https://worldtimeapi.org/api/timezone/${{ .workflowInputs.timezone }}' selectors: - name: timezone expression: '.responseBody | fromjson.abbreviation' - name: datetime expression: '.responseBody | fromjson.datetime'
- name: logTime type: action action: newrelic.instrumentation.log version: 1 inputs: message: 'DEMO: In the ${{ .steps.getCurrentTime.outputs.timezone }} timezone, the current time is ${{ .steps.getCurrentTime.outputs.datetime }}' licenseKey: ${{ :secrets:STAGING_NEW_RELIC_LICENSE_KEY }}
- name: wait type: wait seconds: 1
- name: queryForLog type: action action: newrelic.nrql.query version: 1 inputs: accountIds: ['${{ .workflowInputs.accountId }}'] query: FROM Log SELECT * WHERE message LIKE 'DEMO:%${{ .steps.getCurrentTime.outputs.datetime }}'
- name: checkQuery type: switch switch: - condition: ${{ .steps.queryForLog.outputs.results | length > 0 }} next: postResultsMessage
- name: postWaitingMessage type: action action: slack.chat.postMessage version: 1 inputs: channel: test-channel-workflow text: Waiting for log message... token: ${{ :secrets:dn_staging_slack_token }} next: wait
- name: postResultsMessage type: action action: slack.chat.postMessage version: 1 inputs: channel: test-channel-workflow text: 'Found log message! ${{ .steps.queryForLog.outputs.results[0].message }}' token: ${{ :secrets:dn_staging_slack_token }}