이 기능은 Cloud ID Premium 버전에서 사용할 수 있습니다. 버전 비교하기
이 도움말에는 BigQuery를 사용해 작성한 일반적인 보고서의 쿼리 예가 포함되어 있습니다. 이러한 쿼리 예는 legacy SQL 사용을 전제로 합니다. api_project_name.dataset_name
을 사용할 프로젝트 이름 및 데이터 세트 이름으로 변경합니다.
BigQuery 데이터 쿼리에 대해 자세히 알아보기
Gmail 로그 필드와 그 의미는 BigQuery의 Gmail 활동 로그 스키마를 참고하세요.
쿼리 예
계정관리자 및 위임 계정의 수, 사용 중지/차단/일시정지된 계정의 수를 날짜별로 확인하기
SELECT date,
accounts.num_locked_users,
accounts.num_disabled_accounts,
accounts.num_delegated_admins,
accounts.num_super_admins,
accounts.num_suspended_users,
accounts.num_users
FROM api_project_name.dataset_name.usage
WHERE accounts.num_users IS NOT NULL
ORDER BY date ASC;
관리자가 자주 수행하는 이벤트 확인하기
SELECT count(*) as admin_actions, event_name
FROM api_project_name.dataset_name.activity
WHERE email IN (
SELECT user_email
FROM api_project_name.dataset_name.usage
WHERE accounts.is_super_admin = TRUE
)
GROUP BY 2
ORDER BY 1 DESC;
특정 도메인 내 최고 관리자의 수 확인하기
SELECT COUNT(DISTINCT user_email) as number_of_super_admins, date
FROM api_project_name.dataset_name.usage
WHERE accounts.is_super_admin = TRUE
GROUP BY 2
ORDER BY 2 DESC;
표준 SQL만 가능
Google 캘린더에서 30일 동안의 활성 사용자에 대한 일일 활성 사용자의 비율 확인하기. 이 예시는 여러 테이블에서 쿼리를 수행합니다.
일일 활성 사용자
SELECT date, calendar.num_1day_active_users
FROM api_project_name.dataset_name.usage
WHERE calendar.num_1day_active_users IS NOT NULL
ORDER BY date DESC
30일 활성 사용자
SELECT date, calendar.num_30day_active_users
FROM api_project_name.dataset_name.usage
WHERE calendar.num_30day_active_users IS NOT NULL
ORDER BY date DESC;
유형별 캘린더 일정의 수 확인하기
SELECT COUNT(DISTINCT calendar.calendar_id) AS count, event_name
FROM api_project_name.dataset_name.activity
WHERE calendar.calendar_id IS NOT NULL
GROUP BY 2 ORDER BY 1 DESC;
공유 방법별로 그룹화된 Google 드라이브 공유 항목의 수 확인하기
SELECT COUNT(DISTINCT drive.doc_id) AS count, drive.visibility
FROM api_project_name.dataset_name.activity
WHERE drive.doc_id IS NOT NULL
GROUP BY 2 ORDER BY 1 DESC;
파일 ID, 제목, 소유자, 유형. 특정 기간 내에 외부로 공유된 파일을 확인합니다.
SELECT TIMESTAMP_MICROS(time_usec) AS date, drive.doc_id, drive.doc_title,
drive.owner, drive.doc_type
FROM api_project_name.dataset_name.activity
WHERE drive.visibility = "shared_externally"
ORDER BY 1 DESC
LIMIT 100;
권한 변경 및 그 결과 공유하기. 특정 권한 변경 시 파일 공개 상태가 어떻게 바뀌는지 파악할 수 있습니다.
SELECT TIMESTAMP_MICROS(time_usec) AS date, drive.doc_title,
drive.visibility_change,drive.old_visibility, drive.visibility,
FROM api_project_name.dataset_name.activity
WHERE record_type = "drive"
AND drive.old_visibility IS NOT NULL
AND drive.old_visibility != "unknown";
파일 유형별로 구분된 이벤트 유형. 파일 유형별 채택 보고서에 유용합니다.
SELECT drive.doc_type, event_type, count(*)
FROM api_project_name.dataset_name.activity
WHERE record_type = "DRIVE"
GROUP by 1,2 ORDER BY 3 desc;
각 공유 드라이브의 이벤트 유형 및 이름
SELECT drive.shared_drive_id, event_type, event_name, record_type,
count(distinct drive.doc_id) AS count
FROM api_project_name.dataset_name.activity
WHERE record_type = "drive"
AND drive.shared_drive_id IS NOT NULL
GROUP BY 1,2,3,4 ORDER BY 5 DESC;
도메인 외부 사용자에 대한 정보
SELECT email, event_name, count(*) AS count
FROM api_project_name.dataset_name.activity
WHERE email != ""
AND email NOT LIKE "%mydomain.com%"
GROUP BY 1,2 ORDER BY 3 DESC;
외부 사용자에게 허용된 권한 변경의 종류 및 시기
SELECT drive.target_user, event_name, count(*) AS count
FROM api_project_name.dataset_name.activity
WHERE drive.target_user IS NOT NULL
AND drive.target_user NOT LIKE "%mydomain.com%"
GROUP BY 1,2 ORDER BY 3 DESC;
스토리지 모니터링 관련 정보
설정된 임계값(AND accounts.drive_used_quota_in_mb > 0
절에 정의됨)을 사용하여 드라이브 스토리지 사용량이 X를 초과하는 사용자에 대한 보고서를 작성할 때 유용합니다.
이 쿼리는 예약된 쿼리로 정의할 수 있으며, API를 사용하여 주기적으로 호출할 수도 있습니다.
SELECT date,
user_email,
accounts.drive_used_quota_in_mb,
FROM api_project_name.dataset_name.usage
WHERE accounts.drive_used_quota_in_mb IS NOT NULL
AND accounts.drive_used_quota_in_mb > 0
AND user_email != ""
AND date = CAST(DATE_SUB(CURRENT_DATE(), INTERVAL 7 DAY) AS STRING)
ORDER BY 3,1 DESC;
참고:
- 이 값은 고객이 설정하는 필터에 맞게 수정할 수 있습니다. 예를 들어 15GB가 넘는 경우:
AND accounts.drive_used_quota_in_mb > 15000
CAST(DATE_SUB(CURRENT_DATE(), INTERVAL x DAY) AS STRING)
을 사용하여 날짜를 비교하면 date 값에서 사용 가능한 형식으로 날짜를 비교할 수 있습니다.-
이 쿼리는 유사한 값(
accounts.gmail_used_quota_in_mb
)이 있는 Gmail에도 적용할 수 있습니다.
BigQuery의 Gmail 권장사항
- 필요한 데이터만 쿼리합니다. 예에서는 1,000개 일치로 제한하지만, 원하는 수준으로 제한할 수 있습니다.
- 쿼리 기간을 설정합니다. 일반적으로 기간은 1일로 설정합니다.
제목 일치
지정된 제목과 일치하는 최대 1,000개 레코드의 메일 요약 보기
SELECT TIMESTAMP_MICROS(gmail.event_info.timestamp_usec) as timestamp,
gmail.message_info.subject,
gmail.message_info.source.address,
gmail.message_info.rfc2822_message_id
FROM your_dataset_id.activity
WHERE gmail.message_info.subject LIKE "%test%"
LIMIT 1000
수신자 일치
지정된 수신자의 개별 메일 수
SELECT COUNT(DISTINCT gmail.message_info.rfc2822_message_id)
FROM your_dataset_id.activity d
WHERE
EXISTS(
SELECT 1 FROM d.gmail.message_info.destination WHERE destination.address = "[email protected]")
처리 방법 및 수신자 일치
다음 두 가지 모두와 일치하는 최대 1,000개 레코드의 메일 요약 보기:
- 지정한 처리 방법(수정, 거부, 격리)
- 지정한 수신자
SELECT TIMESTAMP_MICROS(gmail.event_info.timestamp_usec) as timestamp,
gmail.message_info.subject,
gmail.message_info.source.address as source,
destination.address as destination,
gmail.message_info.rfc2822_message_id
FROM your_dataset_id.activity d, d.gmail.message_info.destination
WHERE
destination.address = "[email protected]" AND
EXISTS(SELECT 1 FROM d.gmail.message_info.triggered_rule_info ri, ri.consequence
WHERE consequence.action = 17)
LIMIT 1000
규칙 설명이 트리거됨
지정한 규칙 설명이 트리거되는 최대 1,000개 레코드의 메일 요약 보기
SELECT TIMESTAMP_MICROS(gmail.event_info.timestamp_usec) as timestamp,
gmail.message_info.subject,
gmail.message_info.source.address as source,
destination.address as destination,
gmail.message_info.rfc2822_message_id
FROM your_dataset_id.activity d, d.gmail.message_info.destination
WHERE
EXISTS(SELECT 1 FROM d.gmail.message_info.triggered_rule_info ri, ri.consequence
WHERE consequence.reason LIKE '%description%')
LIMIT 1000
스팸으로 표시됨
최대 1,000개 레코드의 메일 요약 보기:
- 스팸으로 표시됨
- 지정한 수신자
- 모든 이유
SELECT TIMESTAMP_MICROS(gmail.event_info.timestamp_usec) as timestamp,
gmail.message_info.subject,
gmail.message_info.source.address as source,
destination.address as destination,
gmail.message_info.rfc2822_message_id
FROM your_dataset_id.activity d, d.gmail.message_info.destination
WHERE gmail.message_info.is_spam AND
destination.address = "[email protected]"
LIMIT 1000
암호화 프로토콜: 암호화되지 않음
암호화 프로토콜(암호화되지 않음)인 메일 요약 보기
SELECT TIMESTAMP_MICROS(gmail.event_info.timestamp_usec) as timestamp,
gmail.message_info.subject,
gmail.message_info.source.address as source,
destination.address as destination,
gmail.message_info.rfc2822_message_id
FROM your_dataset_id.activity d, d.gmail.message_info.destination
WHERE gmail.message_info.connection_info.smtp_tls_state = 0
LIMIT 1000
암호화 프로토콜: TLS만
암호화 프로토콜(TLS만)인 메일 요약 보기
SELECT TIMESTAMP_MICROS(gmail.event_info.timestamp_usec) as timestamp,
gmail.message_info.subject,
gmail.message_info.source.address as source,
destination.address as destination,
gmail.message_info.rfc2822_message_id
FROM your_dataset_id.activity d, d.gmail.message_info.destination
WHERE gmail.message_info.connection_info.smtp_tls_state = 1
LIMIT 1000
메시지 ID 일치
지정된 메시지 ID의 메일 세부정보 보기(메시지 ID 주위에 '<>' 포함)
SELECT TIMESTAMP_MICROS(gmail.event_info.timestamp_usec) as timestamp,
gmail.event_info.success,
gmail.event_info.elapsed_time_usec,
gmail.message_info.subject,
gmail.message_info.source.address as source,
gmail.message_info.source.service as source_service,
gmail.message_info.source.selector as source_selector,
destination.address as destination,
destination.service,
destination.selector as destination_selector,
gmail.message_info.rfc2822_message_id,
gmail.message_info.payload_size,
gmail.message_info.num_message_attachments,
gmail.message_info.connection_info.smtp_tls_state,
gmail.message_info.description
FROM your_dataset_id.activity d, d.gmail.message_info.destination
WHERE gmail.message_info.rfc2822_message_id = ""
LIMIT 1000
처리 방법: 메일 거부
메일 거부:
- 어떤 규칙으로 거부되었나요?
SELECT TIMESTAMP_MICROS(gmail.event_info.timestamp_usec) as timestamp,
gmail.message_info.subject,
gmail.message_info.source.address as source,
destination.address as destination,
gmail.message_info.rfc2822_message_id,
(SELECT ARRAY_AGG(consequence.reason)
FROM d.gmail.message_info.triggered_rule_info ri, ri.consequence)
FROM your_dataset_id.activity d, d.gmail.message_info.destination
WHERE gmail.message_info.rfc2822_message_id = "<message id>" AND
EXISTS(SELECT 1 FROM d.gmail.message_info.triggered_rule_info ri, ri.consequence
WHERE consequence.action = 17)
LIMIT 1000
처리 방법: 메일 수정
메일 수정:
- 어떤 규칙으로 수정되었나요?
- 수정의 하위 카테고리는 무엇인가요(예: 헤더 또는 제목)?
SELECT TIMESTAMP_MICROS(gmail.event_info.timestamp_usec) as timestamp,
gmail.message_info.subject,
gmail.message_info.source.address as source,
destination.address as destination,
gmail.message_info.rfc2822_message_id,
(SELECT ARRAY_AGG((consequence.action, consequence.reason))
FROM d.gmail.message_info.triggered_rule_info ri, ri.consequence)
FROM your_dataset_id.activity d, d.gmail.message_info.destination
WHERE gmail.message_info.rfc2822_message_id = "<message id>" AND
EXISTS(SELECT 1 FROM d.gmail.message_info.triggered_rule_info ri, ri.consequence
WHERE consequence.action NOT IN (0, 17, 3))
LIMIT 1000
메일 격리
어떤 규칙으로 메일이 스팸으로 분류되었나요?
SELECT TIMESTAMP_MICROS(gmail.event_info.timestamp_usec) as timestamp,
gmail.message_info.subject,
gmail.message_info.source.address as source,
destination.address as destination,
gmail.message_info.rfc2822_message_id,
(SELECT ARRAY_AGG(consequence.reason)
FROM d.gmail.message_info.triggered_rule_info ri, ri.consequence)
FROM your_dataset_id.activity d, d.gmail.message_info.destination
WHERE gmail.message_info.rfc2822_message_id = "<message id>" AND
EXISTS(SELECT 1 FROM d.gmail.message_info.triggered_rule_info ri, ri.consequence
WHERE consequence.action = 3)
LIMIT 1000
복합 쿼리
지난 30일 동안 특정 규칙('규칙 설명')으로 필터링된 모든 메일의 수
SELECT
COUNT(gmail.message_info.rfc2822_message_id) AS message_cnt
FROM
`your_dataset_id.activity`,
UNNEST (gmail.message_info.triggered_rule_info) AS triggered_rule
WHERE
_PARTITIONTIME >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 DAY)
AND triggered_rule.rule_name LIKE "rule description"
지난 1일 이내에 TLS 암호화 없이 수신된 모든 메일 표시:
SELECT gmail.message_info.subject,
gmail.message_info.rfc2822_message_id
FROM `your_dataset_id.activity`
WHERE
_PARTITIONTIME >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 DAY) AND
gmail.message_info.connection_info.smtp_tls_state = 0
지난 30일 이내에 내 계정에서 메일을 교환한 상위 10개 도메인 표시:
SELECT
COUNT(DISTINCT gmail.message_info.rfc2822_message_id) as message_cnt,
IF(gmail.message_info.is_policy_check_for_sender,
REGEXP_EXTRACT(gmail.message_info.source.address , "(@.*)"),
REGEXP_EXTRACT(destination.address , "(@.*)")) AS domain
FROM `your_dataset_id.activity` d, d.gmail.message_info.destination
WHERE
_PARTITIONTIME >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 DAY)
GROUP BY domain
ORDER BY message_cnt desc
LIMIT 10
Gmail에서 30일 동안의 활성 사용자에 대한 일일 활성 사용자의 비율
일일 활성 사용자:
SELECT date,
gmail.num_1day_active_users
FROM api_project_name.dataset_name.usage
WHERE gmail.num_1day_active_users > 0
ORDER BY 1 DESC;
7일 활성 사용자:
SELECT date,
gmail.num_7day_active_users
FROM api_project_name.dataset_name.usage
WHERE gmail.num_7day_active_users > 0
ORDER BY 1 DESC;
30일 활성 사용자:
SELECT date,
gmail.num_30day_active_users
FROM api_project_name.dataset_name.usage
WHERE gmail.num_30day_active_users > 0
ORDER BY 1 DESC;
이메일 메시지와 연결된 분류 라벨이 하나 이상 있는 최근 100개의 Gmail 로그 이벤트
SELECT
resource_details[OFFSET(0)].id AS MESSAGE_ID,
gmail.message_info.subject AS SUBJECT,
gmail.event_info.mail_event_type AS MAIL_EVENT_TYPE,
gmail.message_info.source.address AS SENDER,
resource_details[OFFSET(0)].applied_labels AS LABELS
FROM workspace_audit_logs.activity
WHERE gmail.event_info.mail_event_type > 0 and ARRAY_LENGTH(resource_details) > 0
ORDER by time_usec desc
LIMIT 100;
특정 이메일 메시지에 대해 사용 가능한 모든 로그 이벤트
SELECT
gmail.event_info,
gmail.message_info,
resource_details
FROM workspace_audit_logs.activity
WHERE gmail.message_info.rfc2822_message_id = "<XYZ>"
ORDER by time_usec desc;
Google 그룹 멤버십 변경 및 사용자 행동
SELECT TIMESTAMP_MICROS(time_usec) AS date,
event_name,
admin.group_email,
event_type,
email,
record_type,
admin.user_email,
admin.new_value,
admin.old_value,
admin.setting_name
FROM project_name.dataset_name.activity
WHERE `admin`.group_email IS NOT NULL
AND CONCAT(TIMESTAMP_MICROS(time_usec)) LIKE "%YYYY-MM-DD%"
ORDER BY 1 DESC
LIMIT
1000
YYYY-MM-DD 타임스탬프를 사용하려면 첫 번째 SELECT 구문 요소를 다음으로 변경합니다.
EXTRACT(DATE FROM TIMESTAMP_MICROS(time_usec)) AS date,
다음 방법 중 하나를 사용하여 WHERE 절에서 날짜를 필터링할 수 있습니다.
SELECT TIMESTAMP_MICROS(time_usec) AS date,
event_name,
admin.group_email,
event_type,
email,
record_type,
admin.user_email,
admin.new_value,
admin.old_value,
admin.setting_name
FROM project_name.dataset_name.activity
WHERE `admin`.group_email IS NOT NULL
AND EXTRACT(DATE FROM TIMESTAMP_MICROS(time_usec)) > "2020-06-30"
AND EXTRACT(DATE FROM TIMESTAMP_MICROS(time_usec)) < "2020-08-31"
ORDER BY 1 DESC
LIMIT
1000
SELECT TIMESTAMP_MICROS(time_usec) AS date,
event_name,
admin.group_email,
event_type,
email,
record_type,
admin.user_email,
admin.new_value,
admin.old_value,
admin.setting_name
FROM project_name.dataset_name.activity
WHERE `admin`.group_email IS NOT NULL
AND TIMESTAMP_MICROS(time_usec) > TIMESTAMP("2020-07-21")
AND TIMESTAMP_MICROS(time_usec) < TIMESTAMP("2020-07-23")
ORDER BY 1 DESC
LIMIT
1000
날짜별 영상 통화 수 및 총 통화 시간(분)
SELECT date, meet.num_calls, meet.total_call_minutes
FROM `api_project_name.dataset_name.usage`
WHERE meet.num_calls IS NOT NULL
ORDER BY date ASC
일일 활성 사용자
SELECT date, meet.num_1day_active_users
FROM `api_project_name.dataset_name.usage`
WHERE meet.num_1day_active_users IS NOT NULL
ORDER BY date DESC
30일 활성 사용자
SELECT date, meet.num_30day_active_users
FROM `api_project_name.dataset_name.usage`
WHERE meet.num_30day_active_users IS NOT NULL
ORDER BY date DESC
이름, 일치하는 애플리케이션, 작업별로 실행된 DLP 규칙 확인하기
SELECT TIMESTAMP_MICROS(time_usec) AS date, rules.rule_name, rules.application,
rules.resource_title, rules.actions, rules.resource_owner_email,
rules.data_source, rules.matched_trigger
FROM api_project_name.dataset_name.activity
WHERE rules.rule_name IS NOT NULL
ORDER BY 1 DESC LIMIT 1000;
타사 앱이 Google 드라이브에 액세스하도록 설정된 횟수 확인하기
SELECT token.client_id, scope, token.app_name, count(*) AS count
FROM api_project_name.dataset_name.activity
LEFT JOIN UNNEST(token.scope) AS scope
WHERE scope LIKE "%drive%"
GROUP BY 1,2,3 ORDER BY 4 DESC;
Google 관리자 콘솔 로그인 실패에 대한 자세한 내용 확인하기
SELECT TIMESTAMP_MICROS(time_usec) AS date, email, ip_address,
event_name, login.login_type, login.login_failure_type
FROM api_project_name.dataset_name.activity
WHERE login.login_type IS NOT NULL
AND login.login_failure_type IS NOT NULL
AND event_type = "login"
ORDER BY date DESC;
이 스키마는 변경될 수 있습니다. Reports API 문서에서 업데이트된 매개변수 및 필드를 포함한 전체 목록을 확인할 수 있습니다.
activity(활동) 또는 usage(사용량) 테이블을 쿼리할 때 날짜를 기준으로 필터링할 수 있습니다. 두 테이블에서 사용되는 날짜 표시 형식이 다릅니다.
- activity(활동) 테이블에서는 Unix 마이크로초로 타임스탬프를 저장하며 이는 TIMESTAMP_MICROS() 함수를 사용하여 날짜로 변환할 수 있는 정수 값(숫자)입니다.
- usage(사용량) 테이블에서는 date(날짜) 값이 날짜 형식으로 표시되므로 이 변환이 필요하지 않습니다.
두 테이블 모두에서 다음 방법 중 하나를 사용하여 특정 날짜 또는 기간을 기준으로 필터링할 수 있습니다.
activity(활동) 테이블
Unix Micros(activity(활동) 테이블) 구조를 사용하여 특정 날짜를 기준으로 필터링하려면 다음과 같이 WHERE 절과 TIMESTAMP() 함수를 정의하여 보다 큼(>) 및 보다 작음(<) 연산자로 비교합니다.
SELECT TIMESTAMP_MICROS(time_usec) as date, record_type
FROM api_project_name.dataset_name.activity
WHERE TIMESTAMP_MICROS(time_usec) > TIMESTAMP("2020-07-01")
AND TIMESTAMP_MICROS(time_usec) < TIMESTAMP("2020-07-07")
ORDER BY 1 DESC LIMIT 1000
이는 문자열 유형 매개변수로 추가된 날짜를 사용한 TIMESTAMP() 함수의 반환 값을 TIMESTAMP_MICROS() 함수의 반환 값과 비교하여, 입력되는 time_usec 값의 범위를 제한하는 개념입니다. 이때 표준 SQL의 Timestamp(타임스탬프) 함수 표준을 준수합니다. 또한 WHERE 절에서 간단한 비교 연산자(>) 및 (<)을 사용하고 AND로 확장하여 특정 시간 범위를 지정합니다.
usage(사용량) 테이블
SELECT date, meet.num_calls,
FROM api_project_name.dataset_name.usage
WHERE meet.num_calls IS NOT NULL
AND TIMESTAMP(date) > TIMESTAMP("2020-07-01")
AND TIMESTAMP(date) < TIMESTAMP("2020-07-07")
ORDER BY date DESC;
테이블에 있는 문자열 유형 date(날짜) 값을 TIMESTAMP() 함수로 전달하고 첫 번째 예와 같은 방법으로 비교 연산자 (>) 및 (<)을 사용할 수 있습니다.
쿼리 결과에서 특정 도메인을 포함하거나 제외하려면 WHERE 절에 와일드 카드(%)를 사용하는 이메일 주소 필터를 적용하여 도메인을 필터링합니다.
검색결과에서 특정 도메인을 필터링(제외)할지 또는 특정 도메인만 포함할지에 따라 AND 또는 OR 구문을 사용하는 방법이 다릅니다.
검색결과에서 특정 도메인 제외하기
WHERE email NOT LIKE ("%@sub.%")
AND email NOT LIKE ("%@test.%")
검색결과에 특정 도메인만 포함하기
WHERE email LIKE ("%@sub.%")
OR email LIKE ("%@test.%")
이 쿼리를 사용하여 사용자의 민감한 정보 공유 시도를 추적할 수 있습니다.
SELECT TIMESTAMP_MICROS(time_usec) AS Date,
rules.resource_owner_email AS User,
rules.rule_name AS ruleName,
rules.rule_type AS ruleType,
rules.rule_resource_name AS ruleResourceName,
rules.resource_id AS resourceId,
rules.resource_title AS resourceTitle,
rules.resource_type AS resourceType,
rules.resource_owner_email AS resourceOwner,
CAST(recipients AS STRING) AS Recipients,
rules.data_source AS dataSource,
rules.actor_ip_address AS actorIpAddress,
rules.severity AS severity,
rules.scan_type AS scanType,
rules.matched_trigger AS matchedTriggers,
detect.display_name AS matchedDetectorsName,
detect.detector_id AS matchedDetectorsId,
detect.detector_type AS matchedDetectorsType,
triggers.action_type AS triggeredActions,
suppressors.action_type AS suppressedActions,
FROM api_project_name.dataset_name.activity
LEFT JOIN UNNEST(rules.resource_recipients) as recipients
LEFT JOIN UNNEST(rules.matched_detectors) as detect
LEFT JOIN UNNEST(rules.triggered_actions) as triggers
LEFT JOIN UNNEST(rules.suppressed_actions) as suppressors
WHERE rules.rule_name IS NOT NULL
AND triggers.action_type != "ALERT"
ORDER BY 1 DESC
LIMIT 1000;