개요
XOps는 XOps 스토리와 외부 서비스 관리 플랫폼 간의 양방향 동기화를 지원합니다. 이 통합은 플랫폼 간 조사 활동이 일치하도록 도와주며, 한 플랫폼에서 이루어진 업데이트가 다른 플랫폼에 반영되도록 합니다.
자세한 내용은 서비스 관리 플랫폼과의 양방향 통합 생성하기를 참조하십시오.
서비스나우 통합 구성하기
서비스나우 통합을 구성하려면, 다섯 가지 단계를 완료하십시오.
단계 1: 사용자 정의 필드 생성하기
Cato 관리 애플리케이션 (CMA)에서 티켓이 발행될 때 채워질 필드를 생성하십시오.
사용자 정의 필드를 생성하려면:
서비스나우 플랫폼에 로그인하십시오.
사건을 엽니다.
상단 배너에서 오른쪽 클릭하여 구성 > 양식 빌더로 이동하십시오.
필요시, 양식 빌더 사용에 동의하고 기본 보기를 선택하십시오.
사건 테이블에 새 필드 추가하기를 클릭하십시오.
이 필드를 추가하십시오:
CMA 계정 ID
유형: 정수
속성: 읽기 전용, 필수, 활성
CMA 스토리 ID
유형: 문자열
속성: 읽기 전용, 필수, 활성
단계 2: CMA에서 서비스 API 키 생성하기
서비스 API 키는 외부 도구와 서비스와의 확장 가능한 통합을 가능하게 하며 다음 형식으로 생성됩니다: R=<...>|K=<...>. 서비스 API 키 생성에 대한 정보와 세부 정보는 Cato API에 대한 API 키 생성하기를 참조하십시오.
서비스 API 키를 생성한 후, 이를 복사하고 저장하여 서비스나우 플랫폼에 입력할 수 있도록 하십시오.
단계 3: 안전한 시스템 속성에 API 키 안전하게 저장하기
서비스나우 플랫폼에서, API 키를 저장할 안전한 시스템 속성을 생성하십시오.
안전한 시스템 속성을 생성하려면:
https://<작업 인스턴스>.service-now.com/sys_properties_list.do로 이동하십시오.
신규를 클릭하십시오.
새 시스템 속성 레코드 양식에서, 다음 세부 정보를 추가하십시오:

이름: cma_prod_api_key
유형: Password2
값: 2단계에서 생성한 서비스 API 키
제출을 클릭하세요.
단계 4: REST 메시지 생성하기
서비스나우 사건에서 Cato로 세부 사항을 보내기 위한 REST 메시지를 생성하십시오:
REST 메시지를 생성하려면:
서비스나우 플랫폼에서, All>System Web Services > Outbound > REST Message로 이동하십시오.
신규를 클릭하십시오.
REST 메시지 양식에서, 다음 세부 사항을 추가하십시오:
이름: REST 메시지에 대한 이름 추가
종점: https://<귀하의 Cato 계정 이름>.cc.catonetworks.com/api/v1/graphql2
인증 유형: 인증 없음
HTTP 메서드: 새로 만들기를 클릭하여 다음 세부 내용을 추가하십시오:
이름: 이름 추가
HTTP 메서드: POST
종점: https://<귀하의 Cato 계정 이름>.cc.catonetworks.com/api/v1/graphql2
제출을 클릭하세요.
단계 5: 비즈니스 규칙 생성하기
REST 메시지를 트리거하기 위한 비즈니스 규칙을 생성하십시오.
비즈니스 규칙을 생성하려면:
서비스나우 플랫폼에서, All > System Definitions > Business Rule로 이동하십시오.
신규를 클릭하십시오.
새 비즈니스 규칙 레코드 양식에서, 다음 세부 정보를 추가하십시오:

이름: 비즈니스 규칙에 대한 이름 추가
테이블: 사건
시기: 후
업데이트: 참 (체크박스를 선택하십시오)
필터 조건: 댓글 변경
고급 탭에서, 이 스크립트를 추가하십시오:
(function executeRule(current, previous) { try { var lastComment = current.comments.getJournalEntry(1) || ''; lastComment = stripJournalHeader(lastComment); if (!lastComment) { gs.info("GraphQL webhook: Empty comment, skipping " + current.number); return; } var accountId = current.u_cma_account_id; var storyId = current.u_cma_story_id; gs.info("GraphQL webhook: accountId " + accountId + " story " + storyId); if (!accountId || !storyId) { gs.error("GraphQL webhook: Missing accountId/storyId for " + current.number); return; } var gqlQuery = "mutation CreateStoryComment($accountId: ID!, $input: AddStoryCommentInput!) {" + " xdr(accountId: $accountId) {" + " addStoryComment(input: $input) {" + " comment { id type __typename }" + " __typename" + " }" + " __typename" + " }" + "}"; var body = { query: gqlQuery, variables: { accountId: accountId.toString(), input: { type: "USER", storyId: storyId.toString(), text: lastComment } } }; var apiKey = gs.getProperty('cma_prod_api_key'); var r = new sn_ws.RESTMessageV2('Update XDR story comments CMA Prod', 'post'); r.setRequestHeader('Content-Type', 'application/json'); r.setRequestHeader('Accept', 'application/json'); r.setRequestHeader('x-api-key', apiKey); r.setRequestBody(JSON.stringify(body)); //var response = r.execute(); // can be changed to Async - only for debug purposes var eccSysId = r.executeAsync(); gs.info("GraphQL webhook queued, ECC sys_id=" + eccSysId); var status = response.getStatusCode(); var responseBody = response.getBody(); // Safe logging (see next section for masking) gs.info("GraphQL webhook: status=" + status); gs.info("GraphQL webhook: responseBody=" + responseBody); } catch (ex) { gs.info("GraphQL webhook: Failed: " + ex.message); } function stripJournalHeader(text) { text = text || ''; if (text.indexOf('\n') > -1) { return text.split('\n').slice(1).join('\n').trim(); } return text.trim(); } })(current, previous);제출을 클릭하세요.
문제 해결
다음을 통해 문제와 오류를 식별할 수 있습니다.:
시스템 로그: System Logs > All로 이동하여
GraphQL webhook이 포함된 메시지를 검색하십시오.ECC 레코드: https://<작업 인스턴스>.service-now.com/sys_ecc_queue_list.do로 이동하여 기록된
ECC sys_id가 포함된 ECC 레코드를 찾아보십시오.
일반적인 문제
다음은 일반적인 문제와 그 원인 목록입니다:
이슈 | 원인 |
|---|---|
댓글이 보내지지 않음 | 댓글 텍스트 비어 있음 |
계정/스토리 ID 누락 | 사용자 정의 필드 채워지지 않음 |
API가 400 반환 | 잘못된 요청 형식 |
API가 401 반환 | 잘못된 API 키 |