개요
워크플로우 정의는 YAML로 작성됩니다. 키는 camelCase 명명 규칙을 사용합니다.
스키마 속성
재산 | 필수 또는 선택 | 유형 | 체재 | 제약 | 설명 |
|---|---|---|---|---|---|
| 필수의 | 문자열 | 정규 표현식을 준수해야 합니다.
| 최대 길이 : 100 |
값은 대소문자를 구분하지 않습니다. 예를 들어,
,
,
은 모두 동일한 차트우 정의를 나타내는 것으로 간주됩니다. |
| 선택 과목 | 문자열 | 정규 표현식을 준수해야 합니다.
| 최대 길이 : 200 | 워크플로우의 목적을 설명하는
입니다. |
| 선택 과목 | 지도의 지도 | 최대 크기 : 100 | 워크플로우가 받아들이는 입력의 맵입니다. 자세한 속성은 아래를 참조하십시오. |
워크플로 입력
예 :
workflowInputs: myInput1: type: String myInput2: type: Number defaultValue: 42workflowInputs.<inputName>(필수)- 타입: 문자열 (표현식 안전 패턴 준수)
- 최소 길이: 1
- 최대 길이: 50
- 설명: 폴리스우 입력의 이름입니다.
workflowInputs.<inputName>.type(필수)- 유형: 열거형(
Boolean, List, Map, String, Int, Float) - 설명: 폴리스우 입력의 데이터 유형입니다.
- 유형: 열거형(
workflowInputs.<inputName>.defaultValue(선택 사항)- 유형: 모든 유형;
type준수해야 합니다. - 설명: 플레시아우 입력의 기본값입니다.
- 유형: 모든 유형;
workflowInputs.<inputName>.required(선택 사항)- 유형: 부울(
True,False). - 설명: 이 필드의 기본값은 "True"입니다.
- 유형: 부울(
workflowInputs.<inputName>.enumValues(선택 사항)- 유형: 목록(
String). - 설명: 이 필드의 기본값은 빈 목록
{}입니다. workflowInput 유형이 Enum인 경우 이 설정이 필요합니다.
- 유형: 목록(
workflowInputs.<inputName>.validations(선택 사항)- 유형: 지도가 없습니다.
- 설명: 사용자가 제공한 유효성 검사 입력에 대해 수행할 유효성 검사입니다. 이 항목은 선택 사항입니다. 여기에 설명된 속성은 모든 유효성 검사 유형에 존재합니다. 특정 유효성 검사 유형은 유효성 검사 유형 섹션에서 설명한 대로 추가 속성을 지원합니다.
validations[*].type(필수)- 유형: 문자열
- 설명: 이 필드에 대해 어떤 유효성 검사가 수행될지를 나타내는 유효성 검사 유형입니다. 각 유효성 검사 유형에 대한 자세한 내용은 유효성 검사 유형을 참조하십시오.
validations[*].errorMessage(필수)- 유형: 문자열
- 설명: 특정 유효성 검사가 실패했을 때 사용자가 원하는 오류 메시지입니다.
유효성 검사를 위한 YAML 예시
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'단계
재산 | 필수 또는 선택 | 유형 | 제약 | 설명 |
|---|---|---|---|---|
| 필수의 | 지도의 재발 | 그루우 정의를 실행할 때 수행해야 하는 단계입니다. 최소한 한 단계는 있어야 합니다. 여기에 설명된 속성은 모든 단계 유형에 존재합니다. 특정 단계 유형은 섹션에 설명된 대로 추가 속성을 지원합니다. |
중요
단계는 steps 에 정의된 순서대로 실행됩니다. 다른 순서를 원하는 경우 jump 수행할 수 있습니다. steps[*].next 속성을 건너뛸 원하는 단계의 이름으로 설정하십시오.
공통 단계 속성
재산 | 필수 또는 선택 | 유형 | 체재 | 제약 | 설명 |
|---|---|---|---|---|---|
| 필수의 | 문자열 | 준수해야 하며
될 수 없습니다. | 최대 길이: 100 |
에서 참조할 단계의 이름입니다. 특수 키워드
,
,
은 종료 단계, 루프의 연속 또는 루프에서 나가는 것을 나타내는 데 사용되므로 사용할 수 없습니다. |
| 필수의 | 문자열 | 단계 유형은 단계가 실행될 때 수행하는 작업을 나타냅니다. 사용 가능한 옵션은 아래의 참조하십시오. | ||
| 선택 과목 | 문자열 | 표현 안전 패턴을 준수해야 합니다. | 이 단계가 성공적으로 완료되면 실행될 다음 단계의 이름입니다. 특수 키워드 'end'를 사용하면 이 단계가 마지막으로 실행되어야 함을 나타낼 수 있습니다.
생략되면 정의
의 다음 항목이 암묵적인 다음 단계로 사용됩니다. 후속 입력이 없으면, 해당 입력란이 완성됩니다. | |
| 선택 과목 | 부울 |
은(는) 워크플로우 단계 내의 설정 옵션입니다. 기본값은 false입니다.
로 설정함으로써, 이 단계 실행 중에 발생하는 오류가 전체 이 단계의 실패를 초래하지 않도록 합니다. 대신, 그라우는 후속 단계를 계속 실행합니다. |
단계 유형
동작
특정 동작을 실행하는 단계입니다. 사용 가능한 옵션은 액션 카탈로그를 참조하십시오.
steps[*].action(필수)- 유형: 문자열
- 설명: 실행할 작업 함수의 정규화된 이름입니다. 다음 규칙을 따라야 합니다.
<company domain>.<category of work>.<action name in camelCase>
예 :
뉴렐릭 서비스를 사용한 작업(예: NerdGraph를 통해):
newrelic.dashboards.getDashboardSlack을 사용한 작업:
slack.chat.postMessagesteps[*].version(필수)- 유형: 문자열
- 설명: 실행할 작업 함수의 버전입니다.
steps[*].inputs(선택 사항)유형: 값 맵(표현식 포함)
설명:
- 액션 함수에 전달할 입력입니다. 허용되는 구체적인 입력은 각 작업에 의해 정의됩니다.
- 입력값에는 표현식을 사용할 수 있습니다. 자세한 내용은 표현식 문자열 섹션을 참조하십시오.
중요
민감한 데이터(API 키나 비밀, PII, PHI 또는 개인 식별 데이터)는 인수로 전달되어서는 안 됩니다.
steps[*].inputs.selectors(선택 사항)유형:
name형식의 맵 목록이며expression포함됩니다.설명:
selectors입력을 사용하면 지정된 요소만 반환하도록 출력을 재정의할 수 있습니다.- 표현식을 사용할 수 있습니다. 자세한 내용은 표현식 문자열 섹션을 참조하십시오.
예 :
- 제시된 예에서 우리는 http.get 작업의 응답으로
timezone및datetime얻습니다.
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'고리
루프는 in 으로 정의된 주어진 컬렉션을 반복하고 각 반복에 대해 루프 변수 index 과 element 를 생성합니다. 이러한 루프 변수는 표현식 ${{ .steps.<loopStepName>.loop.element }} 또는 루프 내에서만 액세스할 수 있습니다. ${{ .steps.<loopStepName>.loop.index }
자세한 내용은 다음을 참조하세요.
steps[*].for(필수)- 유형: 상수
- 설명: 루프 시작 신호
steps[*].in(필수)유형: 문자열(표현식)
설명: 요소 컬렉션으로 평가해야 하는 표현식입니다.
steps[*].steps(선택 사항)- 설명: 루프의 각 반복에서 실행되는 단계입니다. 위의 단계에 대한 정의를 참조하세요.
예 :
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 }}"스위치
다양한 조건을 검사하고 참으로 평가되는 첫 번째 분기를 취하는 단계입니다.
스위치는 목록에 임의의 개수의
condition개 요소를 포함할 수 있습니다. 조건을 순서대로 확인하고, 참인 첫 번째 조건부터 처리합니다. 만약 어느 것도 참으로 평가되지 않으면,steps[*].next에 정의된 대로next단계를 실행합니다.steps[*].switch(필수)- 유형: 기타
- 설명: 평가할 조건의 정렬된 목록을 지정하는 switch case의 배열입니다.
steps[*].switch[*].condition(필수)steps[*].switch[*].next(필수)- 타입: 문자열 (표현식 안전 패턴 준수)
- 설명: 해당 조건식이 참으로 평가될 경우 실행할 단계의 이름입니다. 특수 키워드
end을 사용하면 이 단계가 마지막으로 실행되어야 함을 나타낼 수 있습니다.
- name: hasCompletedtype: switchswitch:- condition: ${{ .steps.waitForCompletion.outputs.automationExecutionStatus == "Failed" }}next: displayError- condition: ${{ .steps.waitForCompletion.outputs.automationExecutionStatus == "Success" }}next: displaySuccessnext: displayUnexpected
기다리다
지정된 시간(초) 동안 실행을 일시 중지한 후 계속 진행하는 단계입니다.
대기 단계에서는 하나 이상의 신호를 수신할 수도 있습니다. 각 신호에는 목록에 정의된 해당 다음 단계가 있어야 합니다. 대기 기간 동안 신호가 수신되면, 수신된 첫 번째 신호가 처리되고, 그레이터우는 정의된 다음 단계를 실행합니다. 신호가 수신되지 않으면 대기 시간이 종료된 후 정상적으로 작동합니다.
신호로부터 수신된 값은 대기 단계의 출력에 저장되며, 이후 단계에서 논리 연산이나 처리에 사용될 수 있습니다.
예 :
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(필수)- 유형: 숫자
- 설명: 폴리스우 실행을 계속하기 전에 기다리는 시간(초)입니다.
steps[*].signals- 유형: 기타
- 설명: 수신 시 프로그램 흐름을 전환하는 신호입니다.
steps[*].signals[*].name- 유형: 문자열
- 설명: 수신할 신호의 이름입니다.
steps[*].signals[*].next- 유형: 문자열
- 설명: 지정된 신호를 수신하면 실행할 단계입니다.
양수인
전체 과정에서 사용할 변수를 정의하는 단계입니다. 이 단계에서는 후속 단계에서 참조할 수 있는 변수에 값을 할당합니다. 모든 변수를 한 곳에 정의함으로써, 이 단계 유형은 도표우를 더욱 읽기 쉽고 최적화되게 만듭니다.
샘플 워크플로우:
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(필수)- 데이터 유형: 값 맵(표현식 포함)
- 설명:
- 입력값은 변수 이름과 해당 변수에 할당된 값으로 이루어진 맵입니다. 변수에 비밀 참조가 할당되면 해당 참조는 비밀 참조로 유지되며 실제 값으로 변환되지 않습니다. 하지만 다른 표현식(예: 연산자우 입력)은 평가되어 실제 값으로 변환됩니다.
- 허용되는 입력 유형:
Integer,Double,Boolean,String,ArrayMap
유효성 검사 유형
유효성 검사 유형 | 재산 | 필수 또는 선택 | 유형 | 설명 |
|---|---|---|---|---|
|
| 필수의 | 문자열 | 제공된 정규 표현식 패턴에 대해 '검증우' 입력 값을 검증합니다. |
|
| 필수의 | 정수 | 입력값이 제공된 최대값보다 작아야 함을 검증합니다. |
|
| 필수의 | 정수 | 입력값이 제공된 최소값보다 커야 하는지 검증합니다. |
|
| 필수의 | 정수 | 입력 문자열과 컬렉션(
)의 최대 길이를 검증합니다. |
공유 유형
표현식 문자열
몇몇 속성은 도표우 실행 중에 평가되는 내장 표현식이 포함된 문자열 값을 허용하므로 도표우 정의에서 동적 값을 사용할 수 있습니다.
표현식 문자열은 하나 이상의 표현식을 포함할 수 있으며, 각 표현식은 이중 중괄호로 묶입니다. 중괄호 안의 내용은 jq를 사용하여 평가되며, jq는 값에 접근하고 조작할 수 있는 강력한 기능을 제공합니다.
예 :
입력 문자열의 길이를 구합니다.
${{ .workflowInputs.myString | length }}
표현식의 유효성을 검사하고 테스트하려면 JQ Playground를 사용하십시오.
발현 특성
표현식을 사용하여 여러 속성에 접근할 수 있습니다. 이러한 속성은 scope 객체에 있으므로 범위 객체의 해당 속성에 액세스하려면 표현식이 마침표 (.) 로 시작해야 합니다.
이용 가능한 속성은 다음과 같습니다.
workflowInputs- 시작 시 뷰우에 전달되는 입력값을 담고 있는 객체입니다.
예 :
${{ .workflowInputs.myInput }}
steps- 각 단계에 대한 속성을 포함하는 객체steps.<stepName>- 특정 단계에 대한 속성을 포함하는 객체steps.<stepName>.outputs- 단계 또는 작업에 특정한 결과 속성을 포함하는 객체입니다.
예 : ${{ .steps.myStep.outputs.myResult }}
발현 평가 결과
하나의 jq 표현식으로 모든 JSON 유형을 평가할 수 있습니다. 하지만 표현식 문자열의 최종 결과는 문자열에 표현식만 포함되어 있는지 아니면 추가 콘텐츠가 포함되어 있는지에 따라 달라집니다.
단일 표현식(JSON 유형 유지):
표현식 문자열이 주변에 내용이 없고 하나의 표현식으로만 구성된 경우, 원래 JSON 유형을 유지하면서 jq 표현식의 결과로 평가됩니다. 예를 들어, ${{ .workflowInputs.myArray }} an으로 평가됩니다. 이는 복잡한 데이터 구조를 전달하는 데 유용합니다.
여러 표현 또는 혼합된 콘텐츠(문자열로 변환):
표현식 문자열에 단일 표현식 이외의 내용이 포함되어 있으면 문자열 결과로 평가됩니다. 이는 표현식 앞뒤에 내용이 있거나 문자열 내에 여러 표현식이 포함된 경우에 발생합니다. 문자열 내의 각 표현식은 평가되어 문자열 표현으로 변환됩니다.
중요
jq 표현식이 null로 평가되면 null 노드가 반환됩니다. 예를 들어 표현식 ${{ .workflowInputs.missingInput }} 은 missingInput 입력으로 주어지지 않으면 null을 반환합니다.
예 :
myArray 의 값이 [1, 2, 3] 이라고 가정해 봅시다.
표현식 문자열 | 결과 데이터 | 결과 유형 |
|---|---|---|
|
| 숫자의 비교 |
| 삼 | 숫자 |
| 사실 | 부울 |
|
| 문자열 |
|
| 문자열 |
표현 안전 패턴
표현식에서 사용할 수 있는 속성은 다음 조건을 충족해야 합니다. ^[A-Za-z_][A-Za-z0-9_]*$
비밀 참고 자료
비밀 값은 Secret Service에서 검색할 비밀의 이름을 지정하는 참조 문자열을 통해 작업에서 사용될 수 있습니다. 스텔라우 정의에서 비밀을 참조하려면 다음 구문을 사용하세요.
${{ :secrets:<SECRET_NAME> }}비밀이 아닌 것에 대해namespace${{ :secrets:<NAMESPACE>:<SECRET_NAME> }}비밀을 위해namespace${{ :secrets:<SCOPE>:<NAMESPACE>:<SECRET_NAME> }}범위 및 네임스페이스 내의 비밀 정보입니다. 현재 범위는ACCOUNT또는ORGANIZATION만 허용합니다.
표현식 문자열에는 비밀 참조와 JQ 표현식이 혼합되어 포함될 수 있습니다. and/or 여러 개의 비밀 참조.
예시:
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> }}예
캘린더 데모
입력, HTTP 액션, 선택자, 대기 단계, NRQL 쿼리, 스위치 문 및 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 }}