개요
워크플로우 정의는 실행할 자동화된 프로세스를 설명합니다. 워크플로우 정의는 camelCase 명명 규칙과 함께 YAML을 사용합니다. 각 워크플로우는 다음과 같이 구성됩니다:
- 스키마 속성: 기본 정보(이름, 설명 및 입력)
- 단계: 수행해야 할 일련의 행동
- 표현식: jq 구문을 사용한 동적 값
- 비밀: 보안 자격 증명 참조
스키마 구조
스키마 속성
다음 표는 워크플로우 정의의 최상위 속성을 설명합니다.
재산 | 필수 또는 선택 | 유형 | 체재 | 제약 | 설명 |
|---|---|---|---|---|---|
| 필수의 | 문자열 | 정규 표현식을 준수해야 합니다.
| 최대 길이 : 100 |
값은 대소문자를 구분하지 않습니다. 예를 들어,
,
및
은 모두 동일한 워크플로우 정의를 나타내는 것으로 간주됩니다. |
| 선택 과목 | 문자열 | 정규 표현식을 준수해야 합니다.
| 최대 길이 : 200 | 워크플로우의 목적에 대한 설명입니다. |
| 선택 과목 | 지도의 지도 | 최대 크기 : 100 | 워크플로우가 허용하는 워크플로우 입력의 맵입니다. 다음 섹션의 workflowInputs 속성을 참조하십시오. |
워크플로 입력값(선택 사항)
다음 예는 workflowInputs 정의를 보여줍니다:
workflowInputs: myInput1: type: String myInput2: type: Number defaultValue: 42각 입력 항목은 다음 필드를 지원합니다:
workflowInputs.<inputName>(필수의)- 타입: 문자열 (표현식 안전 패턴 준수)
- 최소 길이: 1
- 최대 길이: 50
- 설명: 폴리스우 입력의 이름입니다.
workflowInputs.<inputName>.type(필수의)- 유형: 열거형(
Boolean, List, Map, String, Int, Float, Enum) - 설명: 폴리스우 입력의 데이터 유형입니다.
- 유형: 열거형(
workflowInputs.<inputName>.defaultValue(선택 과목)- 유형:
type에 부합하는 모든 값입니다. - 설명: 플레시아우 입력의 기본값입니다.
- 유형:
workflowInputs.<inputName>.required(선택 과목)- 유형: 부울(
True,False). - 설명: 이 필드의 기본값은
true입니다.
- 유형: 부울(
workflowInputs.<inputName>.enumValues(선택 과목)- 유형: 목록(
String). - 설명: 이 필드의 기본값은 빈 목록
{}입니다.workflowInputs타입이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'워크플로 상수 (선택 사항)
워크플로우 상수는 현재 실행 중인 워크플로우에 대한 런타임 메타데이터에 대한 액세스를 제공합니다. 이러한 상수는 모든 워크플로우 정의에서 자동으로 사용할 수 있으며 표현식 구문 ${{ .workflowConstants.<constantName> }}을(를) 사용하여 참조할 수 있습니다.
사용 가능한 상수
다음 상수는 모든 워크플로우 정의에서 사용할 수 있습니다.
끊임없는 | 유형 | 설명 |
|---|---|---|
| 문자열 | 현재 플로우플로우 실행을 위한 고유 구분 |
| Int | 그루우가 실행 중인 계정 ID |
| 문자열 | 워크플로우와 관련된 조직 ID |
| 문자열 | 흐름 흐름 정의 이름 |
| 문자열 | 워크플로우 정의 버전 |
| 문자열 | 워크플로우 정의의 범위 유형 |
| 시간소인 | Epoch 타임스탬프(밀리초)가 워크플로우 실행이 시작된 시점입니다. |
사용 예
name: testWorkflowConstantsWithJQ description: Test workflow to demonstrate workflowConstants usage steps: - name: logWithConstants type: action action: newrelic.ingest.sendLogs version: '1' inputs: logs: - message: Workflow Execution Started attributes: accountId: ${{ .workflowConstants.accountId }} orgId: ${{ .workflowConstants.organizationId }} version: ${{ .workflowConstants.definitionVersion }} scopeType: ${{ .workflowConstants.definitionScopeType }} startedAt: ${{ .workflowConstants.startedAt }} runId: ${{ .workflowConstants.runId }} workflowDefinitionName: ${{ .workflowConstants.definitionName }}값을 변환하려면 jq 표현식과 함께 워크플로우 상수를 사용하십시오:
steps: - name: transformConstants type: action action: newrelic.ingest.sendLogs version: '1' inputs: logs: - message: Testing JQ transformations on workflowConstants attributes: # Convert epoch milliseconds to ISO8601 format startedAtISO8601: ${{ (.workflowConstants.startedAt / 1000) | todateiso8601 }} # Convert to uppercase runIdUppercase: ${{ .workflowConstants.runId | ascii_upcase }} # Get string length definitionNameLength: ${{ .workflowConstants.definitionName | length }} # Convert to string accountIdString: ${{ .workflowConstants.accountId | tostring }} # Combine multiple constants combinedMetadata: ${{ .workflowConstants.definitionName + "-" + .workflowConstants.runId }}다음 예제는 DateTime 작업을 사용하여 타임스탬프를 변환합니다:
steps: - name: convertStartedAtFromEpoch type: action action: utils.datetime.fromEpoch version: 1 inputs: timestamp: ${{ .workflowConstants.startedAt }} timezoneId: UTC pattern: "yyyy-MM-dd HH:mm:ss" timestampUnit: MILLISECONDS selectors: - name: datetime expression: ".datetime" - name: timezone expression: ".timezone"제약 조건 및 동작
중요
워크플로우 상수를 사용할 때 다음 사항에 유의하십시오:
- 런타임은 워크플로우 상수를 자동으로 제공합니다. 읽기 전용입니다.
startedAt타임스탬프는 밀리초(에포크 형식) 단위입니다.- 상수는 워크플로우 전체의 모든 표현식 컨텍스트에서 사용할 수 있습니다.
workflowInputs과(와) 달리 워크플로우 정의에서 상수를 선언할 필요가 없습니다.
단계
다음 표는 워크플로우 정의의 steps 속성을 설명합니다.
재산 | 필수 또는 선택 | 유형 | 제약 | 설명 |
|---|---|---|---|---|
| 필수의 | 지도의 재발 | 워크플로우 정의가 실행될 때 실행할 단계입니다. 하나 이상의 단계가 있어야 합니다. 여기에 나열된 속성은 모든 단계 유형에 적용됩니다. 특정 단계 유형은 추가 속성을 지원합니다. 자세한 내용은 을 참조하십시오. |
중요
단계는 steps 어레이에 정의한 순서대로 실행됩니다. 실행 순서를 변경하려면 steps[*].next 속성을 건너뛸 단계의 이름으로 설정하십시오.
공통 단계 속성
다음 속성은 모든 단계 유형에 적용됩니다.
재산 | 필수 또는 선택 | 유형 | 체재 | 제약 | 설명 |
|---|---|---|---|---|---|
| 필수의 | 문자열 | 을 준수해야 하며
일 수 없습니다. | 최대 길이: 100 |
이(가) 참조하는 단계의 이름입니다. 이는 종료 단계, 루프 계속 또는 루프 중단을 나타내므로 특수 키워드
,
또는
일 수 없습니다. |
| 필수의 | 문자열 | 실행 시 단계가 수행하는 작업을 나타내는 단계의 유형입니다. 사용 가능한 옵션은 을 참조하십시오. | ||
| 선택 과목 | 문자열 | 을 준수해야 합니다 | 이 단계가 성공적으로 완료될 때 실행할 다음 단계의 이름입니다. 특수 키워드
은(는) 이것이 실행할 마지막 단계임을 나타냅니다.
이(가) 생략되면
어레이의 다음 항목이 암시적 다음 단계가 됩니다. 다음 항목이 없으면 워크플로우가 완료됩니다. | |
| 선택 과목 | 부울 |
은(는) 기본값이
인 단계 수준 설정 옵션입니다.
(으)로 설정하면 이 단계의 실행 중 오류가 발생해도 전체 워크플로우가 실패하지 않으며 — 워크플로우는 다음 단계로 계속됩니다. |
단계 유형
동작
특정 동작을 실행하는 단계입니다. 사용 가능한 옵션은 액션 카탈로그를 참조하십시오.
steps[*].action(필수의)- 유형: 문자열
- Description [설명]: 실행할 작업 함수의 정규화된 이름입니다. 다음 규칙을 따라야 합니다:
<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'고리
루프는 컬렉션(목록, 맵, 어레이)을 반복하고 각 반복에 대해 index 및 element 변수를 자동으로 생성합니다. ${{ .steps.<loopStepName>.loop.element }} 또는 ${{ .steps.<loopStepName>.loop.index }}을(를) 사용하여 루프 내에서만 이러한 루프 변수에 액세스할 수 있습니다.
루프 단계는 다음 속성을 지원합니다:
steps[*].for(필수의)- 유형: 상수
- 설명: 루프의 시작을 알립니다.
steps[*].in(필수의)- 유형: 문자열(표현식)
- 설명: 요소 모음으로 평가되는 표현식입니다.
steps[*].steps(필수의)- 설명: 각 반복에서 실행할 단계입니다. 각 단계는 중첩 루프를 포함하여 모든 단계 타입이 될 수 있습니다.
중요
루프를 사용할 때 다음 사항에 유의하십시오:
for(필수) 루프의 시작을 표시합니다.in(필수) 자바 어레이로 캐스팅할 수 있는 컬렉션으로 평가되어야 합니다.steps(필수) 각 반복에서 실행되는 단계를 정의합니다.- 런타임은 각 반복에서
element및index을(를) 할당합니다.index은(는) 0부터 시작합니다.element은(는) 복합 유형일 수 있습니다. - 루프 내부에 생성된 변수는 ― 루프 변수 및 단계 출력 포함 ― 루프 내에서만 액세스할 수 있습니다. 루프는 종료 시 이를 지웁니다.
- 루프는 루프 외부에 정의된 변수에 액세스할 수 있습니다.
예시: 기본 반복문
name: myRangeIteratorsteps: - name: looper type: loop for: # iterate over [1..5] in: ${{ [range(1; 6)] }} steps: - name: logProgress type: action action: newrelic.ingest.sendLogs version: 1 inputs: logs: - message: "Element: ${{ .steps.looper.loop.element | tostring }}" # not exist outside of this loop attributes: # ranges over [0..4] index: ${{ .steps.looper.loop.index }}예시: jq 표현식과 함께 for 루프 사용
name: process-ordersdescription: Process and validate orders
workflowInputs: validStatuses: type: List defaultValue: ["pending", "confirmed", "shipped"]
steps: - name: getOrders type: assign inputs: orders: - { id: "001", status: "pending", amount: 100 } - { id: "002", status: "invalid", amount: 50 } - { id: "003", status: "shipped", amount: 200 }
- name: processOrders type: loop for: in: ${{ .steps.getOrders.outputs.orders }} steps: - name: validateStatus type: switch switch: - condition: ${{ .steps.processOrders.loop.element.status as $status | .workflowInputs.validStatuses | index($status) != null }} next: validOrder next: invalidOrder
- name: invalidOrder type: action action: newrelic.ingest.sendLogs version: 1 inputs: logs: - message: "Invalid order status" attributes: orderId: ${{ .steps.processOrders.loop.element.id }} status: ${{ .steps.processOrders.loop.element.status }}
- name: validOrder type: action action: newrelic.ingest.sendLogs version: 1 inputs: logs: - message: "Processing valid order" attributes: orderId: ${{ .steps.processOrders.loop.element.id }} status: ${{ .steps.processOrders.loop.element.status }} amount: ${{ .steps.processOrders.loop.element.amount }}예시: 지도에서 반복
name: myMapIteratorsteps: - name: looper type: loop for: in: '${{ [ {"key1": "val1"}, {"key2": "val2"} ] }}' steps: - name: logProgress type: action action: newrelic.ingest.sendLogs version: 1 inputs: logs: - message: "Element: ${{ .steps.looper.loop.element | tostring }}"예시: 루프 내에서 점프하기
동일한 루프 내의 단계 간에 이동할 수 있습니다. 루프 안팎으로, 다른 루프 간에, 또는 부모/자식 루프로 이동할 수 없습니다.
name: myLoopJumpsteps: - name: fistStep type: action action: newrelic.ingest.sendLogs version: 1 inputs: logs: - message: "the first step" - name: loopStep type: loop for: in: ${{ [range(1; 6)] }} steps: - name: loopStep1 type: action action: newrelic.ingest.sendLogs version: 1 inputs: logs: - message: "the loop first step" next: loopStep3 # Okay within the loop - name: loopStep2 type: action action: newrelic.ingest.sendLogs version: 1 inputs: logs: - message: "the loop second step, never executed" - name: loopStep3 type: action action: newrelic.ingest.sendLogs version: 1 inputs: logs: - message: "the loop third step" next: fistStep # Not okay, first step is not in the loop context예시: 중단 후 계속
루프 흐름을 제어하려면 next: break 또는 next: continue을(를) 사용하십시오. 이들은 루프 내의 예약어입니다. 루프 외부에서는 워크플로우 끝으로 이동합니다. 루프 내부에서 end은(는) break처럼 동작합니다.
name: myLoopContinueBreaksteps: - name: fistStep type: action action: newrelic.ingest.sendLogs version: 1 inputs: logs: - message: "the first step" - name: loopStep type: loop for: in: ${{ [range(1; 6)] }} steps: - name: loopStep1 type: action action: newrelic.ingest.sendLogs version: 1 inputs: logs: - message: "the loop first step" # continue with next iteration without executing loopStep2 next: continue - name: loopStep2 type: action action: newrelic.ingest.sendLogs version: 1 inputs: logs: - message: "the loop second step, never executed"
- name: loopAgain type: loop for: in: ${{ [range(1; 6)] }} steps: - name: loopAgainStep1 type: action action: newrelic.ingest.sendLogs version: 1 inputs: logs: - message: "the loop again first step" # stop iterating and continue with next step after the loop next: break - name: loopAgainStep2 type: action action: newrelic.ingest.sendLogs version: 1 inputs: logs: - message: "the loop again second step, never executed"
- name: lastStep type: action action: newrelic.ingest.sendLogs version: 1 inputs: logs: - message: "the last step"스위치
스위치 단계는 다양한 조건을 확인하고 참으로 평가되는 첫 번째 분기를 사용합니다. 목록에 원하는 수의 condition 요소를 포함할 수 있으며, 순서대로 확인하고 참으로 평가되는 첫 번째 요소를 처리합니다. 참으로 평가되는 것이 없으면 steps[*].next에 정의된 대로 next 단계를 실행합니다.
steps[*].switch(필수의)- 유형: 기타
- 설명: 평가할 조건의 정렬된 목록을 지정하는 switch case의 배열입니다.
steps[*].switch[*].condition(필수의)steps[*].switch[*].next(필수의)- 타입: 문자열 (표현식 안전 패턴 준수)
- Description [설명]: 케이스의 조건이 true로 평가될 경우 실행할 단계의 이름입니다. 특수 키워드
end은(는) 이것이 실행할 마지막 단계임을 나타냅니다.
- name: hasCompleted type: switch switch: - condition: ${{ .steps.waitForCompletion.outputs.automationExecutionStatus == "Failed" }} next: displayError - condition: ${{ .steps.waitForCompletion.outputs.automationExecutionStatus == "Success" }} next: displaySuccess next: displayUnexpected기다리다
지정된 시간(초) 동안 실행을 일시 중지한 후 계속 진행하는 단계입니다.
대기 단계는 하나 이상의 신호를 수신할 수도 있습니다. 각 신호는 해당하는 다음 단계를 정의해야 합니다. 대기 단계가 신호를 수신하면 수신된 첫 번째 신호를 처리하고 정의된 다음 단계를 실행합니다. 신호가 수신되지 않으면 대기 기간이 끝난 후 워크플로우가 다음 단계로 계속됩니다.
대기 단계는 수신된 신호 값을 출력에 저장하여 후속 단계에서 사용할 수 있도록 합니다.
다음 예제는 신호 처리기가 있는 대기 단계를 보여줍니다:
name: waitSignalExamplesteps: - name: waitStep type: wait seconds: 300 signals: [{name: 'mySignal', next: 'mySignalHandler'}] - name: endStep type: action action: newrelic.ingest.sendLogs version: 1 inputs: logs: - message: "didn't get signal" next: end - name: mySignalHandler type: action action: newrelic.ingest.sendLogs version: 1 inputs: logs: # log entry "got signal with data bar" when using signalInputs [{"foo": "bar"}] - message: "got signal with data ${{ .steps.waitStep.outputs.signalInputs.foo }}"wait 단계는 다음 속성을 허용합니다:
steps[*].seconds(필수의)- 유형: 숫자
- 설명: 폴리스우 실행을 계속하기 전에 기다리는 시간(초)입니다.
steps[*].signals- 유형: 기타
- 설명: 대기 단계가 수신할 때 프로그램 흐름을 전환하는 신호입니다.
steps[*].signals[*].name- 유형: 문자열
- 설명: 수신할 신호의 이름입니다.
steps[*].signals[*].next- 유형: 문자열
- 설명: 지정된 신호가 수신될 경우 실행할 단계입니다.
양수인
워크플로우 전체에서 사용할 변수를 정의하는 단계입니다. 이 단계는 후속 단계에서 참조할 수 있는 변수에 값을 할당합니다. 이 단계 유형을 사용하면 워크플로우 전체에서 사용할 모든 변수를 한 곳에서 정의할 수 있습니다.
다음 샘플 워크플로우는 assign 단계를 사용하는 방법을 보여줍니다:
name: sampleWorkflowWithAssign
workflowInputs: initialValue: type: String defaultValue: "abcd" anotherValue: type: Int defaultValue: 1234
steps: - 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 }}"
- 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 }}"할당 단계는 다음 입력을 받습니다:
steps[*].inputs(필수의)- 데이터 유형: 값 맵(표현식 포함)
- 설명:
- 입력은 변수 이름과 할당된 값의 맵입니다. 변수에 시크릿 참조를 할당하면 참조로 유지되며 시스템은 이를 실제 값으로 변환하지 않습니다. 그러나 워크플로우는 다른 표현식(예: 워크플로우 입력)을 평가하고 실제 값으로 변환합니다.
- 허용되는 입력 유형:
Integer,Double,Boolean,String,ArrayMap
상태
워크플로우의 공유 상태에 핵심 가치 쌍을 저장하는 단계입니다. 값은 워크플로우 실행 기간 동안 유지됩니다. 후속 단계는 .workflowState 접근자를 사용하여 이러한 값에 액세스할 수 있습니다. 여러 상태 단계가 동일한 키를 설정하는 경우, 이후의 각 값이 이전 값을 덮어씁니다.
상태 단계는 다음 입력을 허용합니다:
steps[*].inputs(필수의)유형: 핵심 가치 쌍의 맵
설명: 워크플로우 상태에 저장할 핵심 가치 쌍입니다.
- 키는 유효한 식별자여야 합니다.
- 값은 모든 유형 ―
String,Integer,Boolean,List또는Map(중첩된 구조 포함)가 될 수 있습니다. 값에는 표현식이 포함됩니다. 런타임은 시크릿 참조를 해석하지 않으며 ― 있는 그대로 저장합니다.
표현식에서 상태 값에 액세스하려면 상태 단계 이후의 모든 단계에서 .workflowState.<keyName>을(를) 사용하십시오:
${{ .workflowState.myKey }}
다음 예제는 값을 저장하고 검색하는 상태 단계를 보여줍니다:
name: workflow-state-exampledescription: Store and retrieve state across stepssteps: - name: storeInitialData type: state inputs: count: 1 foo: "bar" - name: updateCount type: state inputs: color: "green" count: 2 - name: logState type: action action: newrelic.ingest.sendLogs version: 1 inputs: logs: - message: "foo=${{ .workflowState.foo }}, color=${{ .workflowState.color }}, count=${{ .workflowState.count }}"상태 단계에는 다음 제약 조건이 있습니다:
- 키 이름 패턴:
^[a-zA-Z_][a-zA-Z0-9_]*$ - 키 이름 최대 길이: 255자
- 상태 단계당 최대 키: 10
- 워크플로우 실행당 최대 총 상태 키: 100
- 상태 값 최대 길이: 1,000자
오류
워크플로우를 종료하고 사용자 지정 메시지와 함께 실패를 보고하는 단계입니다. condition이(가) 있는 경우 워크플로우는 이를 먼저 평가하고 조건이 true일 때만 중지합니다. message을(를) 제공하지 않으면 단계에서 기본 메시지 failed as requested from step: failureStep을(를) 사용합니다.
다음 예는 조건이 있는 오류 단계를 보여줍니다:
name: sendLogWorkflowdescription: 'This workflow send Logs to newrelic'steps: - name: sendLog type: action action: newrelic.ingest.sendLogs version: 1 inputs: logs: - message: Sending Logs to NewRelic - name: error_4 type: error condition: ${{.steps.sendLog.outputs.success == false}} message: Terminating Workflow as sendLog failed. next: end다음 표는 오류 단계에서 허용하는 입력을 설명합니다.
입력 필드 | 선택성 | 유형 | 예시 |
|---|---|---|---|
| 선택 과목 | 문자열 |
|
| 선택 과목 | 문자열 |
|
유효성 검사 유형
다음 유효성 검사 유형은 workflowInputs에 사용할 수 있습니다.
유효성 검사 유형 | 재산 | 필수 또는 선택 | 유형 | 설명 |
|---|---|---|---|---|
|
| 필수의 | 문자열 | 제공된 정규 표현식 패턴에 대해 '검증우' 입력 값을 검증합니다. |
|
| 필수의 | 정수 | 워크플로우 입력 값이 제공된 maxValue보다 작은지 확인합니다. |
|
| 필수의 | 정수 | 워크플로우 입력 값이 제공된 minValue보다 큰지 확인합니다. |
|
| 필수의 | 정수 | 워크플로우 입력 문자열 및 컬렉션(
,
,
및 기타 컬렉션 타입)의 최대 길이를 검증합니다. |
표현식 및 시크릿
표현식 문자열
여러 속성은 워크플로우가 실행 중에 평가하는 포함된 표현식이 있는 문자열 값을 허용하여 워크플로우 정의에서 동적 값을 사용할 수 있게 합니다.
표현식 문자열에는 하나 이상의 표현식이 포함될 수 있으며, 각각은 이중 중괄호로 묶여 있습니다. jq는 중괄호 안의 내용을 평가하여 값에 액세스하고, 필터링하고, 변환할 수 있도록 합니다.
다음 예제는 워크플로우 입력 문자열의 길이를 가져옵니다:
${{ .workflowInputs.myString | length }}
표현식의 유효성을 검사하고 테스트하려면 JQ Playground를 사용하십시오.
발현 특성
표현식을 사용하여 이러한 속성에 액세스할 수 있습니다. 이들은 scope 객체에 존재하므로, 범위 객체의 해당 속성에 액세스하려면 표현식이 마침표 (.) (으)로 시작해야 합니다.
이용 가능한 속성은 다음과 같습니다.
workflowInputs― 시작 시 워크플로우에 전달된 입력이 포함된 객체입니다.예 :
${{ .workflowInputs.myInput }}workflowState— 현재 워크플로우 실행 중에state단계에 의해 저장된 핵심 가치 쌍을 포함하는 객체입니다.예제 (플랫 키, 중첩 속성, 어레이 인덱스):
${{ .workflowState.myKey }}·${{ .workflowState.myMap.nestedProperty }}·${{ .workflowState.myList[0] }}steps— 워크플로우의 각 단계에 대한 속성을 포함하는 객체입니다.steps.<stepName>— 특정 단계에 대한 속성을 포함하는 객체입니다.steps.<stepName>.outputs― 단계 또는 작업과 관련된 결과 속성이 포함된 객체입니다.
예 :
${{ .steps.myStep.outputs.myResult }}
발현 평가 결과
하나의 jq 표현식으로 모든 JSON 유형을 평가할 수 있습니다. 하지만 표현식 문자열의 최종 결과는 문자열에 표현식만 포함되어 있는지 아니면 추가 콘텐츠가 포함되어 있는지에 따라 달라집니다.
단일 표현식(JSON 유형 유지)
표현식 문자열이 주변 내용 없이 하나의 표현식으로만 구성된 경우, 원래 JSON 유형을 유지하면서 jq 표현식의 결과로 평가됩니다. 예를 들어, ${{ .workflowInputs.myArray }}은(는) 어레이로 평가됩니다. 이는 단계 간에 전달할 때 복잡한 데이터 구조의 유형을 보존합니다.
다중 표현식 또는 혼합 콘텐츠(문자열로 변환됨)
표현식 문자열에 단일 표현식 이외의 내용이 포함된 경우, 문자열 결과로 평가됩니다. 이는 표현식 앞이나 뒤에 내용이 있거나, 문자열 내에 여러 표현식이 있는 경우에 발생합니다. jq는 각 표현식을 평가하고 문자열 표현으로 변환합니다.
중요
jq 표현식이 null로 평가되면 null 노드가 반환됩니다. 예를 들어, missingInput이(가) 워크플로우 입력으로 제공되지 않으면 표현식 ${{ .workflowInputs.missingInput }}은(는) null을 반환합니다.
다음 예제는 [1, 2, 3] 값과 함께 myArray을(를) 사용합니다.
표현식 문자열 | 결과 데이터 | 결과 유형 |
|---|---|---|
|
| 숫자의 비교 |
| 삼 | 숫자 |
| 사실 | 부울 |
|
| 문자열 |
|
| 문자열 |
표현 안전 패턴
표현식에 사용하는 속성은 다음을 준수해야 합니다: ^[A-Za-z_][A-Za-z0-9_]*$
비밀 참고 자료
Secrets Service에서 조회할 시크릿의 이름을 지정하는 참조 문자열을 제공하여 작업에서 시크릿 값을 사용하십시오. 워크플로우 정의에서 시크릿을 참조하려면 다음 구문을 사용하십시오:
${{ :secrets:<SECRET_NAME> }}비밀이 아닌 것에 대해namespace${{ :secrets:<NAMESPACE>:<SECRET_NAME> }}비밀을 위해namespace${{ :secrets:<SCOPE>:<NAMESPACE>:<SECRET_NAME> }}범위 및 네임스페이스의 시크릿에 대해
SCOPE ACCOUNT 또는 ORGANIZATION을(를) 허용합니다.
표현식 문자열에는 jq 표현식, 시크릿 참조 또는 둘 다 포함될 수 있습니다.
다음은 작업에 사용되는 시크릿 참조의 예입니다:
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> }}전체 예시
캘린더 데모
이 완전한 워크플로우 예제는 워크플로우 상수, 선택기, 대기 단계, NRDB 쿼리 및 switch 문을 포함한 여러 워크플로우 기능을 보여줍니다.
name: calendar_demo
steps: - name: getUserCreated type: action action: newrelic.nerdgraph.execute version: 1 inputs: graphql: | { actor { user { id createdAt timeZoneName } } } selectors: - name: id expression: ".data.actor.user.id" - name: createdAt expression: ".data.actor.user.createdAt" - name: timeZoneName expression: ".data.actor.user.timeZoneName"
- name: getCreatedTime type: action action: utils.datetime.fromEpoch version: 1 inputs: timestamp: ${{ .steps.getUserCreated.outputs.createdAt }} pattern: "yyyy-MM-dd HH:mm:ss" timezoneId: ${{ .steps.getUserCreated.outputs.timeZoneName }} selectors: - name: datetime expression: ".datetime" - name: abbreviation expression: ".timezone.abbreviation"
- name: logTime type: action action: newrelic.ingest.sendLogs version: 1 inputs: logs: - message: "Demo ${{ .workflowConstants.runId }} userId ${{ .steps.getUserCreated.outputs.id }} created at ${{ .steps.getCreatedTime.outputs.datetime }} ${{ .steps.getCreatedTime.outputs.abbreviation }}"
- name: wait type: wait seconds: 1
- name: queryForLog type: action action: newrelic.nrdb.query version: 1 inputs: query: "FROM Log SELECT message, timestamp SINCE 5 minute ago WHERE message LIKE 'Demo ${{ .workflowConstants.runId }} userId ${{ .steps.getUserCreated.outputs.id }} created at%'"
- name: checkQuery type: switch switch: - condition: ${{ .steps.queryForLog.outputs.results | length > 0 }} next: postResultsMessage
- name: postWaitingMessage type: action action: newrelic.ingest.sendLogs version: 1 inputs: logs: - message: "Waiting for log message..." next: wait
- name: postResultsMessage type: action action: newrelic.ingest.sendLogs version: 1 inputs: logs: - message: "Found log message! ${{ .steps.queryForLog.outputs.results[0].message }}"