개요
정의는 실행될 자동화된 프로세스를 설명합니다. 정의는 camelCase 명명 규칙을 사용하여 YAML로 작성됩니다. 각 흐름은 다음과 같이 구성됩니다.
- 스키마 속성: 기본 정보(이름, 설명, 입력값)
- 단계: 수행해야 할 일련의 행동
- 표현식: jq 구문을 사용한 동적 값
- 비밀: 보안 자격 증명 참조
기초 개념
건축우를 구축하기 전에 건축우 정의 전반에 사용되는 다음 핵심 개념을 이해하십시오.
스키마 구조
스키마 속성
재산 | 필수 또는 선택 | 유형 | 체재 | 제약 | 설명 |
|---|---|---|---|---|---|
| 필수의 | 문자열 | 정규 표현식을 준수해야 합니다.
| 최대 길이 : 100 |
값은 대소문자를 구분하지 않습니다. 예를 들어,
,
,
은 모두 동일한 차트우 정의를 나타내는 것으로 간주됩니다. |
| 선택 과목 | 문자열 | 정규 표현식을 준수해야 합니다.
| 최대 길이 : 200 | 워크플로우의 목적을 설명하는
입니다. |
| 선택 과목 | 지도의 지도 | 최대 크기 : 100 | 워크플로우가 받아들이는 입력의 맵입니다. 자세한 속성은 아래를 참조하십시오. |
워크플로 입력값(선택 사항)
- 유형: 지도의 지도
- 최대 크기: 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'워크플로 상수 (선택 사항)
워크플로우 상수는 현재 실행 중인 워크플로우에 대한 런타임 메타데이터에 대한 접근을 제공합니다. 이러한 상수는 모든 정의에서 자동으로 사용 가능하며 표현식 구문 ${{ .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 에 정의된 순서대로 실행됩니다. 다른 순서를 원하는 경우 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'고리
루프는 컬렉션(리스트, 맵, 객체)을 순회하며 각 반복마다 index 및 element 변수를 자동으로 생성합니다. 이러한 루프 변수는 ${{ .steps.<loopStepName>.loop.element }} 또는 를 사용하여 루프 내에서만 접근할 수 있습니다. ${{ .steps.<loopStepName>.loop.index }}
속성:
steps[*].for(필수)- 유형: 상수
- 설명: 반복문의 시작을 알립니다.
steps[*].in(필수)- 유형: 문자열(표현식)
- 설명: 요소들의 모음으로 평가되는 표현식
steps[*].steps(필수)- 설명: 각 반복마다 실행되는 단계입니다. 중첩 루프를 포함하여 모든 단계 유형을 포함할 수 있습니다.
중요
- 대상: (필수). 이는 for 루프의 시작을 나타내는 최상위 요소입니다.
- 입력란: (필수). 반복할 입력 컬렉션을 자바로 캐스팅할 수 있어야 합니다.
- 단계: (필수). 각 반복마다 단계가 실행됩니다.
- 요소 와 인덱스는 루프의 일부로 자동으로 할당됩니다.
index0부터 시작하며, 복소수 요소로 이루어진 컬렉션이 있는 경우element복소수 유형이 될 수 있습니다.- 반복문 내부에서 생성된 변수(반복문 변수 및 단계 출력)는 반복문 내에서만 접근 가능합니다.
- 이 변수들은 루프가 종료될 때 초기화되며, 루프 외부에서 접근하면 null이 됩니다.
- 반복문은 반복문 외부에서 정의된 변수에 접근할 수 있습니다.
예시: 기본 반복문
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(필수)- 타입: 문자열 (표현식 안전 패턴 준수)
- 설명: 해당 조건식이 참으로 평가될 경우 실행할 단계의 이름입니다. 특수 키워드
end을 사용하면 이 단계가 마지막으로 실행되어야 함을 나타낼 수 있습니다.
- name: hasCompletedtype: switchswitch:- condition: ${{ .steps.waitForCompletion.outputs.automationExecutionStatus == "Failed" }}next: displayError- condition: ${{ .steps.waitForCompletion.outputs.automationExecutionStatus == "Success" }}next: displaySuccessnext: 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 }}"steps[*].seconds(필수)- 유형: 숫자
- 설명: 폴리스우 실행을 계속하기 전에 기다리는 시간(초)입니다.
steps[*].signals- 유형: 기타
- 설명: 수신 시 프로그램 흐름을 전환하는 신호입니다.
steps[*].signals[*].name- 유형: 문자열
- 설명: 수신할 신호의 이름입니다.
steps[*].signals[*].next- 유형: 문자열
- 설명: 지정된 신호를 수신하면 실행할 단계입니다.
양수인
전체 과정에서 사용할 변수를 정의하는 단계입니다. 이 단계에서는 후속 단계에서 참조할 수 있는 변수에 값을 할당합니다. 모든 변수를 한 곳에 정의함으로써, 이 단계 유형은 도표우를 더욱 읽기 쉽고 최적화되게 만듭니다.
샘플 워크플로우:
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
오류
워크플로우를 종료하고 사용자 지정 메시지로 실패를 보고하는 단계입니다. 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입력 필드 | 선택성 | 유형 | 예시 |
|---|---|---|---|
메시지 | 선택 과목 | 문자열 |
|
상태 | 선택 과목 | 문자열 |
|
유효성 검사 유형
유효성 검사 유형 | 재산 | 필수 또는 선택 | 유형 | 설명 |
|---|---|---|---|---|
|
| 필수의 | 문자열 | 제공된 정규 표현식 패턴에 대해 '검증우' 입력 값을 검증합니다. |
|
| 필수의 | 정수 | 입력값이 제공된 최대값보다 작아야 함을 검증합니다. |
|
| 필수의 | 정수 | 입력값이 제공된 최소값보다 커야 하는지 검증합니다. |
|
| 필수의 | 정수 | 입력 문자열과 컬렉션(
)의 최대 길이를 검증합니다. |
공유 유형
표현식 문자열
몇몇 속성은 도표우 실행 중에 평가되는 내장 표현식이 포함된 문자열 값을 허용하므로 도표우 정의에서 동적 값을 사용할 수 있습니다.
표현식 문자열은 하나 이상의 표현식을 포함할 수 있으며, 각 표현식은 이중 중괄호로 묶입니다. 중괄호 안의 내용은 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> }}전체 예시
캘린더 데모
워크플로우 상수, 선택자, 대기 단계, NRDB 쿼리, 스위치 문을 포함한 여러 워크플로우 기능을 보여주는 완전한 워크플로우 예제입니다.
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 }}"