시작하기 전에
먼저 AWX 리포지토리를 복제하거나 로컬 복사본을 만들어야 합니다. 일반적으로 AWX의 최신 안정 버전을 사용하는 것이 좋습니다. 최신 안정 버전은 AWX 최신 릴리스 페이지에서 확인할 수 있습니다.
최신 안정 태그를 복제하려면 다음 명령어를 사용할 수 있습니다.
git clone -b x.y.z https://github.com/ansible/awx.git
HEAD(또는 최신 커밋)에서 배포하는 것은 안정성이 없으므로 가능하면 피하는 것이 좋습니다. 필요하다면 진행하기 전에 리포지토리를 복제하세요.
환경 개요
Docker Compose로 AWX 개발 환경을 설정하는 데 사용되는 주요 명령어와 파일은 다음과 같습니다.
docker-compose-build
: 개발 이미지를 빌드하는 데 사용됩니다. 이 이미지는docker-compose
명령어에서 사용됩니다.docker-compose
: 개발 환경을 시작하는 데 사용되는 make 명령어로,awx_devel
이미지와 태그를 전달합니다.
중요한 파일로는 다음이 있습니다.
tools/docker-compose/inventory
: AWX 개발 환경을 구성하는 데 사용되는 인벤토리 파일입니다.tools/docker-compose/ansible/migrate.yml
: 로컬 도커에서 개발 환경으로 데이터를 마이그레이션하는 데 사용되는 플레이북입니다.
사전 요구 사항
AWX를 배포할 호스트에는 다음 사항이 필요합니다.
- Docker가 설치되어 있어야 합니다. Docker를 설치한 후 Docker 서비스를 시작해야 합니다. 운영 체제에 따라 Docker를 사용하는 로컬 사용자를 docker 그룹에 추가해야 할 수도 있습니다. 자세한 내용은 Docker 문서를 참조하세요.
- Docker Compose가 설치되어 있어야 합니다.
- Ansible도 설치되어 있어야 하며, docker-compose에 필요한 파일을 템플릿화하는 데 사용됩니다.
- OpenSSL도 설치되어 있어야 합니다.
테스트된 운영 체제
docker-compose 개발 환경은 다음 운영 체제에서 정기적으로 사용되며 작동해야 합니다.
- Fedora (유지되는 버전)
- Ubuntu LTS (18, 20)
- Red Hat Enterprise Linux 8, CentOS Stream 8
- macOS 11
다른 플랫폼에서는 테스트되지 않았으며, 로컬 수정이 필요할 수 있습니다.
구성
인벤토리 파일에서 pg_password
, broadcast_websocket_secret
, secret_key
및 배포에 필요한 기타 설정을 설정해야 합니다.
AWX는 PostgreSQL 데이터베이스에 액세스가 필요하며, 기본적으로 컨테이너 내에서 데이터를 유지합니다. 컨테이너가 중지될 때 데이터 파일은 Docker 볼륨에 계속 남습니다. 외부 데이터베이스를 사용하려면 pg_host
, pg_hostname
및 pg_username
을 설정합니다.
로컬 도커 설치에서 데이터를 마이그레이션하려면 데이터 마이그레이션 섹션을 참조하세요.
개발 환경 시작
- 이미지 빌드
AWX 기본 컨테이너 이미지는 기본 OS 종속성 및 개발 환경에서 서비스를 실행하는 데 도움이 되는 심볼릭 링크를 포함하는 Dockerfile.j2에서 템플릿화된 Dockerfile을 기반으로합니다. 다음 명령어로 이미지를 빌드합니다.
make docker-compose-build
이미지는 Dockerfile.j2 또는 템플릿화된 Dockerfile을 변경하는 경우 다시 빌드해야 합니다. 빌드가 완료되면 로컬 이미지 캐시에 ansible/awx_devel
이미지가 생성됩니다. 이미지 목록을 보려면 docker images
명령어를 사용할 수 있습니다.
(host)$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ansible/awx_devel latest ba9ec3e8df74 26 minutes ago 1.42GB
- 커스텀 Receptor 이미지 생성
개발 환경은 기본적으로 Receptor의 devel
이미지를 사용합니다. 이 이미지는 hop 노드에서 직접 사용되며, Receptor 바이너리는 모든 다른 AWX 노드에서 사용됩니다. 따라서 RECEPTOR_IMAGE
환경 변수를 설정하여 두 개의 명령어로 이미지를 빌드해야 합니다.
먼저 Receptor를 체크아웃하고 make receptor_build
명령을 사용하여 빌드합니다.
cd /path/to/receptor
git checkout origin/devel
make docker-image
다음, AWX 리포지토리의 루트 디렉토리로 이동하고 다음 명령어로 receptor_build
작업을 수행합니다.
cd /path/to/awx
make receptor_build
- 개발 환경 시작
이제 개발 환경을 시작합니다. AWX, PostgreSQL 및 Redis 컨테이너가 자동으로 시작됩니다. 필요한 이미지가 없으면 다운로드하게 됩니다.
make docker-compose
이 명령을 실행하면 도커 컴포즈가 실행되고 AWX 개발 환경이 설정됩니다. 컨테이너를 시작하고 컨테이너에 연결할 수 있습니다. 컨테이너가 실행 중인 동안 AWX 개발 이미지에 대한 로그 메시지 및 이벤트를 실시간으로 모니터링할 수 있습니다.
초기 시작 시 데이터베이스 관련 문제 해결
실행 중에 무한 반복되는 메시지( Waiting for postgres to be ready to accept connections )가 나타나면 다음을 수행해 보세요.
- AWX 관련 Docker 컨테이너를 중지하고 삭제합니다.
- 연결된 모든 도커 볼륨을 삭제합니다.
- 연결된 모든 Docker 네트워크를 삭제합니다.
- 처음부터 과정을 반복하세요.
시스템에 AWX 관련 컨테이너 엔터티만 있는 경우 다음 명령을 사용하여 모든 항목을 중지하고 삭제할 수 있습니다.
docker stop $(docker ps -a -q)
docker system prune -a
docker volume prune
docker network prune
(대체 방법) 맞춤형 메시 노드 클러스터로 개발 환경 스핀업
실행 노드와 홉 노드가 있는 클러스터(컨테이너)는 docker-compose Makefile 대상으로 생성될 수 있습니다. 기본적으로 1개의 하이브리드 노드가 생성됩니다. MAIN_NODE_TYPE를 사용하여 하이브리드와 제어 간에 AWX 노드 유형을 전환할 수 있습니다.
MAIN_NODE_TYPE=control EXECUTION_NODE_COUNT=2 COMPOSE_TAG=devel make docker-compose
위 명령을 실행하면 제어 노드 1개, 홉 노드 1개, 실행 노드 2개로 구성된 클러스터가 생성됩니다. 홉 노드는 실행 노드가 1개 이상 있을 때마다 자동으로 생성됩니다.
노드 수는 다음과 같이 변경될 수 있습니다.
CONTROL_PLANE_NODE_COUNT=2 EXECUTION_NODE_COUNT=3 COMPOSE_TAG=devel make docker-compose
그러면 아래에 표시된 토폴로지가 회전됩니다. (이름은 수용자 노드 이름이며 경우에 따라 AWX 인스턴스 이름 및 네트워크 주소와 다릅니다)
┌──────────────┐ │ │ ┌──────────────┐ ┌──────────┤ receptor-1 │ │ │ │ │ │ │ awx_1 │◄──────────┐ │ └──────────────┘ │ │ │ ▼ └──────┬───────┘ ┌──────┴───────┐ ┌──────────────┐ │ │ │ │ │ │ │ receptor-hop │◄───────┤ receptor-2 │ ▼ │ │ │ │ ┌──────────────┐ └──────────────┘ └──────────────┘ │ │ ▲ │ awx_2 │ │ ┌──────────────┐ │ │ │ │ │ └──────────────┘ └──────────┤ receptor-3 │ │ │ └──────────────┘
모든 실행(receptor-*) 노드는 홉 노드에 연결됩니다. 노드 awx_1만 AWX 클러스터 외부의 홉 노드에 연결됩니다. awx_1은 awx_2에 연결하여 AWX 클러스터가 완전히 연결되었다는 요구 사항을 충족합니다.
예를 들어, awx_2를 컨트롤러 노드로, receptor-3을 실행 노드로 하여 작업이 시작되면, awx_2는 awx_1을 통해 receptor-3과 통신한 다음 receptor-hop을 합니다.
데이터베이스 마이그레이션
환경을 처음 시작할 때 PostgreSQL 데이터베이스를 구축하려면 데이터베이스 마이그레이션을 실행해야 합니다. 몇 분 정도 걸리는데 터미널 세션에 다음과 같은 출력이 표시됩니다. 마이그레이션이 완료되면 AWX 개발 환경을 사용할 수 있습니다.
awx_1 | Operations to perform:
awx_1 | Synchronize unmigrated apps: solo, api, staticfiles, debug_toolbar, messages, channels, django_extensions, ui, rest_framework, polymorphic
awx_1 | Apply all migrations: sso, taggit, sessions, sites, kombu_transport_django, social_auth, contenttypes, auth, conf, main
awx_1 | Synchronizing apps without migrations:
awx_1 | Creating tables...
awx_1 | Running deferred SQL...
awx_1 | Installing custom SQL...
awx_1 | Running migrations:
awx_1 | Rendering model states... DONE
awx_1 | Applying contenttypes.0001_initial... OK
awx_1 | Applying contenttypes.0002_remove_content_type_name... OK
awx_1 | Applying auth.0001_initial... OK
...
UI 정리 및 빌드
$ docker exec tools_awx_1 make clean-ui ui-devel
마이그레이션이 완료되고 UI가 구축되면 AWX 사용을 시작할 수 있습니다. UI는 브라우저에서 https://localhost:8043/#/home 에 접속할 수 있으며, API는 https://localhost:8043/api/v2 에서 찾을 수 있습니다.
관리자 계정 생성
개발 환경에서 관리자 계정을 만들어야 합니다. 다음 명령어를 사용하여 관리자 계정을 생성하세요.
docker exec -ti tools_awx_1 awx-manage createsuperuser
이 명령을 실행하면 관리자 계정을 만들 수 있습니다. 관리자 계정을 사용하여 서버 구성을 시작할 수 있습니다.
데모 데이터로드 (선택 사항)
데모 데이터를 로드할 수 있으며, 이를 통해 데모 프로젝트, 인벤토리 및 작업 템플릿이 생성됩니다.
데모 데이터를 로드하려면 다음 명령어를 사용합니다.
docker exec tools_awx_1 awx-manage create_preload_data
이로써 데이터가 데이터베이스에 저장되며, 데이터베이스 스키마가 변경될 때 데이터베이스를 재생성해야 할 수도 있습니다.
이제 AWX를 Docker 환경에서 성공적으로 구성하고 설정했으며 사용할 수 있습니다. 이를 통해 Ansible 워크플로 및 자동화를 실행하고 모니터링할 수 있습니다. Docker 환경을 통해 AWX를 더 효율적으로 관리하고 테스트할 수 있습니다.
로컬 Docker 환경에서 Ansible Galaxy Slack 모듈을 설치하여 AWX를 구성하는 단계입니다.
- AWX 소스 코드 다운로드
GitHub에서 AWX 소스 코드를 다운로드하거나 Git을 사용하여 복제할 수 있습니다.git clone https://github.com/ansible/awx.git
- Docker Compose 파일 편집
AWX를 로컬 Docker 환경에서 실행하려면 Docker Compose 파일을 수정해야 합니다. AWX 소스 코드 디렉토리 내에 docker-compose.yml 파일을 찾을 수 있습니다. 이 파일을 편집하여 Slack 모듈을 설치하고 추가합니다.
위의 Docker Compose 파일에서 주목해야 할 부분은 environment 섹션과 command 섹션입니다. Slack 모듈을 설치하려면 ANSIBLE_GALAXY_CLI_COLLECTION_OPTS 및 ANSIBLE_GALAXY_CLI_ROLES_OPTS 환경 변수를 사용합니다. Slack 모듈 설치 명령이 command 섹션에 추가됩니다.version: '3' services: web: # ... environment: - ANSIBLE_GALAXY_CLI_COLLECTION_OPTS='--ignore-certs' - ANSIBLE_GALAXY_CLI_ROLES_OPTS='--ignore-certs' - AWX_ALLOW_ANY_HOST # ... command: /bin/bash -c "source /venv/awx/bin/activate && ansible-galaxy collection install community.general && gunicorn -k gevent -w 4 -b 0.0.0.0:8052 --chdir /var/lib/awx/projects/local -t 3600 awx.wsgi:application --reload" volumes: - awx-awx-web:/etc/awx # ... # ...
- AWX 실행 및 Slack 모듈 설치
AWX를 실행하려면 AWX 소스 코드 디렉토리 내에서 다음 명령을 실행합니다.
이 명령은 Docker Compose를 사용하여 AWX 컨테이너 그룹을 시작합니다.Slack 모듈을 설치하려면 AWX 컨테이너를 다시 빌드하고 실행해야 합니다. AWX 컨테이너를 다시 빌드하려면 다음 명령을 실행합니다.docker-compose up -d
그런 다음 AWX를 다시 실행합니다.docker-compose build
Slack 모듈이 AWX 컨테이너 내에서 설치되고 AWX가 실행됩니다.docker-compose up -d
- AWX 작업 생성
이제 AWX 웹 인터페이스를 사용하여 Slack 모듈을 포함한 작업을 생성하고 Slack로 알림을 보낼 수 있습니다.
이렇게 하면 로컬 Docker 환경에서 Ansible Galaxy Slack 모듈을 AWX와 함께 사용하여 AWX를 구성할 수 있습니다. AWX 소스 코드를 수정하고 Docker Compose를 사용하여 모듈을 설치하고 실행하면 됩니다.
Prometheus와 Grafana 통합
Prometheus는 메트릭 수집 도구로, api/v2/metrics 엔드포인트에서 Prometheus 형식의 데이터를 지원합니다.
Prometheus는 일정 간격으로 대상을 폴링하도록 구성되며 다양한 인증 방법을 사용할 수 있습니다. 우리는 Prometheus를 기본 인증을 사용하고 5초마다 AWX를 기본적으로 폴링하도록 구성합니다. 이 구성은 docker-compose/ansible/roles/sources/templates/prometheus.yml.j2 템플릿을 사용하여 생성됩니다. 값을 변경하려면 해당 템플릿을 수정하거나 해당 템플릿에서 사용되는 ansible 변수를 설정하십시오 (다음 섹션의 EXTRA_SOURCES_ANSIBLE_OPTS의 사용 방법 참조).
Grafana는 데이터를 시각화하고 경보 기능을 제공하는 대시보드를 제공합니다.
Grafana의 "프로비저닝 파일" 기능을 사용하여 파일에서 경보 및 대시보드 구성을 배포할 수 있습니다.
이러한 구성 파일은 tools/grafana에서 컨테이너로 마운트되는 디렉토리에 위치합니다.
Grafana와 Prometheus를 사용하여 docker-compose를 실행하는 방법
개발 환경을 실행하려면 다음 변수를 설정하여 Prometheus와 Grafana를 활성화하십시오.
$ PROMETHEUS=yes GRAFANA=yes make docker-compose
배포 프로세스에서 사용하는 추가 ansible 변수를 전달하려면 EXTRA_SOURCES_ANSIBLE_OPTS를 전달할 수 있습니다.
GRAFANA=true PROMETHEUS=true EXTRA_SOURCES_ANSIBLE_OPTS="-e scrape_interval=1 admin_password=foobar" make docker-compose
Grafana 및 Prometheus를 보는 위치
- Prometheus는 http://localhost:9090/targets 에서 확인하고 메트릭 엔드포인트 State가 Up인지 확인하십시오.
- 그래프 탭을 클릭하고 메트릭 이름을 입력하거나 메트릭을 표시할 메트릭을 찾기 위해 실행 버튼 옆에있는 Open metrics explorer 버튼을 사용하십시오.
- Grafana로 이동하여 http://localhost:3001 로 이동하십시오. 사용자 이름과 암호 모두 admin을 사용하여 로그인하십시오.
- 왼쪽 네비게이션 메뉴에서 대시보드->탐색으로 이동하고 "awx-demo"를 찾아 클릭하십시오. 이러한 대시보드에는 그래프가 있어야 합니다.
- 이제 이러한 대시보드를 수정하고 원하는 메트릭에 대한 패널을 추가할 수 있습니다.
Grafana의 알람
우리는 프로비저닝 파일 방법을 사용하여 Grafana에서 경보를 구성하고 있습니다. 이 기능은 2022년 8월 현재 Grafana에서 새롭게 도입된 기능입니다. 문서는 https://grafana.com/docs/grafana/latest/administration/provisioning/#alerting에서 찾을 수 있지만 모든 구성에 필요한 모든 매개변수를 완전히 보여주지는 않습니다.
규칙을 작성하는 방법을 이해하는 한 가지 방법은 UI에서 규칙을 작성하고 규칙을 저장할 때 페이로드를 검사하는 것입니다. 각 규칙의 페이로드의 "data" 부분이 프로비저닝 파일 구성에 필요한 구문과 동일한 것처럼 보입니다. 컨테이너를 다시 시작하지 않고 경보를 다시로드하려면 터미널에서 curl을 사용하여 curl -X POST http://admin:admin@localhost:3001/api/admin/provisioning/alerting/reload
을 보내면됩니다.
규칙을 내보내는 또 다른 방법은 API를 탐색하는 것입니다.
- 모든 폴더 가져오기:
GET /api/folders
- 규칙 가져오기 :
GET /api/ruler/grafana/api/v1/rules/{{폴더}}
curl을 사용하거나 웹 브라우저에서 이 작업을 수행할 수 있습니다.
포함된 알람
남은 용량이 낮고 대기 작업이 있는 경우 경보
작업이 대기 중이지만 클러스터에서 실행할 수 있는 용량이 부족한 경우를 알고 싶습니다. 접근 방식은 클러스터의 모든 남은 용량을 합산하고 클러스터의 총 용량과 비교하는 것입니다. 남은 용량이 용량의 10% 미만이고 대기 작업이 있는 경우, 그리고 이것이 180초 이상 유효한 경우 경보를 생성합니다.
---
apiVersion: 1
groups:
- folder: awx
interval: 10s
name: awx_rules
orgId: 1
exec_err_state: Alerting
no_data_state: NoData
rules:
- for: 5m
noDataState: OK
panelId: 2
title: failure_rate_exceeded_20_percent
uid: failure_rate_exceeded_20_percent
condition: compare
data:
- refId: total_errors
queryType: ""
relativeTimeRange:
from: 600
to: 0
datasourceUid: awx_prometheus
model:
editorMode: code
expr: >-
max(delta(awx_instance_status_total{instance="awx1:8013",
status=~"failed|error"}[30m]))
hide: false
intervalMs: 1000
legendFormat: __auto
maxDataPoints: 43200
range: true
refId: total_errors
- refId: max_errors
queryType: ""
relativeTimeRange:
from: 0
to: 0
datasourceUid: "-100"
model:
conditions:
- evaluator:
params:
- 80
- 0
type: gt
operator:
type: and
query:
params:
- total_errors
reducer:
params: []
type: max
type: query
datasource:
name: Expression
type: __expr__
uid: __expr__
expression: total_errors
hide: false
intervalMs: 1000
maxDataPoints: 43200
reducer: max
refId: max_errors
type: reduce
- refId: total_success
queryType: ""
relativeTimeRange:
from: 600
to: 0
datasourceUid: awx_prometheus
model:
datasource:
type: prometheus
uid: awx_prometheus
editorMode: code
expr: >-
max(delta(awx_instance_status_total{instance="awx1:8013",
status="successful"}[30m]))
hide: false
intervalMs: 1000
legendFormat: __auto
maxDataPoints: 43200
range: true
refId: total_success
- refId: max_success
queryType: ""
relativeTimeRange:
from: 0
to: 0
datasourceUid: "-100"
model:
conditions:
- evaluator:
params:
- 0
- 0
type: gt
operator:
type: and
query:
params:
- total_success
reducer:
params: []
type: max
type: query
datasource:
name: Expression
type: __expr__
uid: __expr__
expression: total_success
hide: false
intervalMs: 1000
maxDataPoints: 43200
reducer: max
refId: max_success
type: reduce
- refId: compare
queryType: ""
relativeTimeRange:
from: 0
to: 0
datasourceUid: "-100"
model:
conditions:
- evaluator:
params:
- 0
- 0
type: gt
operator:
type: and
query:
params:
- max_success
reducer:
params: []
type: avg
type: query
- evaluator:
params:
- 0
- 0
type: gt
operator:
type: and
query:
params:
- max_success
reducer:
params: []
type: avg
type: query
datasource:
name: Expression
type: __expr__
uid: __expr__
expression: $max_errors / ($max_errors+$max_success) >= .2
hide: false
intervalMs: 1000
maxDataPoints: 43200
refId: compare
type: math
- for: 60s
noDataState: OK
panelId: 1
title: redis_queue_too_large_to_clear_in_2_min
uid: redis_queue_too_large_to_clear_in_2_min
condition: redis_queue_growing_faster_than_insertion_rate
dashboardUid: awx
data:
- refId: events_insertion_rate_per_second
relativeTimeRange:
from: 300
to: 0
datasourceUid: awx_prometheus
model:
editorMode: code
expr: irate(callback_receiver_events_insert_db{node='awx_1'}[1m])
hide: false
intervalMs: 1000
legendFormat: __auto
maxDataPoints: 43200
range: true
refId: events_insertion_rate_per_second
queryType: ""
- refId: mean_event_insertion_rate
relativeTimeRange:
from: 0
to: 0
datasourceUid: -100
model:
conditions:
- evaluator:
params:
- 3
type: gt
operator:
type: and
query:
params:
- event_insertion_rate
reducer:
params: []
type: last
type: query
datasource:
type: __expr__
uid: -100
expression: events_insertion_rate_per_second
hide: false
intervalMs: 1000
maxDataPoints: 43200
reducer: mean
refId: mean_event_insertion_rate
type: reduce
queryType: ""
- refId: redis_queue_size
relativeTimeRange:
from: 300
to: 0
datasourceUid: awx_prometheus
model:
datasource:
type: prometheus
uid: awx_prometheus
editorMode: code
expr: callback_receiver_events_queue_size_redis{node='awx_1'}
hide: false
intervalMs: 1000
legendFormat: __auto
maxDataPoints: 43200
range: true
refId: redis_queue_size
queryType: ""
- refId: last_redis_queue_size
relativeTimeRange:
from: 0
to: 0
datasourceUid: -100
model:
conditions:
- evaluator:
params:
- 3
type: gt
operator:
type: and
query:
params:
- event_insertion_rate
reducer:
params: []
type: last
type: query
datasource:
type: __expr__
uid: -100
expression: redis_queue_size
hide: false
intervalMs: 1000
maxDataPoints: 43200
reducer: last
refId: last_redis_queue_size
type: reduce
queryType: ""
- refId: redis_queue_growing_faster_than_insertion_rate
queryType: ""
relativeTimeRange:
from: 0
to: 0
datasourceUid: -100
model:
conditions:
- evaluator:
params:
- 0
- 0
type: gt
operator:
type: and
query:
params:
- last_redis_queue_size
reducer:
params: []
type: avg
type: query
datasource:
name: Expression
type: __expr__
uid: __expr__
expression: "($last_redis_queue_size > ($mean_event_insertion_rate * 120))"
hide: false
intervalMs: 1000
maxDataPoints: 43200
type: math
- for: 60s
noDataState: OK
panelId: 3
uid: capacity_below_10_percent
title: capacity_below_10_percent
condition: pending_jobs_and_capacity_compare
data:
- refId: remaining_capacity
queryType: ""
relativeTimeRange:
from: 300
to: 0
datasourceUid: awx_prometheus
model:
editorMode: code
expr: sum(awx_instance_remaining_capacity)
hide: false
intervalMs: 1000
legendFormat: __auto
maxDataPoints: 43200
range: true
refId: remaining_capacity
- refId: last_remaining_capacity
queryType: ""
relativeTimeRange:
from: 0
to: 0
datasourceUid: "-100"
model:
conditions:
- evaluator:
params:
- 3
type: outside_range
operator:
type: and
query:
params:
- total_capacity
reducer:
params: []
type: percent_diff
type: query
datasource:
type: __expr__
uid: "-100"
expression: remaining_capacity
hide: false
intervalMs: 1000
maxDataPoints: 43200
reducer: last
refId: last_remaining_capacity
type: reduce
- refId: total_capacity
queryType: ""
relativeTimeRange:
from: 600
to: 0
datasourceUid: awx_prometheus
model:
datasource:
type: prometheus
uid: awx_prometheus
editorMode: code
expr: sum(awx_instance_capacity{instance="awx1:8013"})
hide: false
intervalMs: 1000
legendFormat: __auto
maxDataPoints: 43200
range: true
refId: total_capacity
- refId: last_total_capacity
queryType: ""
relativeTimeRange:
from: 0
to: 0
datasourceUid: "-100"
model:
conditions:
- evaluator:
params:
- 0
- 0
type: gt
operator:
type: and
query:
params:
- capacity_below_10%
reducer:
params: []
type: avg
type: query
datasource:
name: Expression
type: __expr__
uid: __expr__
expression: total_capacity
hide: false
intervalMs: 1000
maxDataPoints: 43200
reducer: last
refId: last_total_capacity
type: reduce
- refId: 10_percent_total_capacity
queryType: ""
relativeTimeRange:
from: 0
to: 0
datasourceUid: "-100"
model:
conditions:
- evaluator:
params:
- 0
- 0
type: gt
operator:
type: and
query:
params:
- last_total_capacity
reducer:
params: []
type: avg
type: query
datasource:
name: Expression
type: __expr__
uid: __expr__
expression: "$last_total_capacity*.10"
hide: false
intervalMs: 1000
maxDataPoints: 43200
refId: 10_percent_total_capacity
type: math
- refId: pending_jobs
queryType: ""
relativeTimeRange:
from: 600
to: 0
datasourceUid: awx_prometheus
model:
datasource:
type: prometheus
uid: awx_prometheus
editorMode: builder
expr: awx_pending_jobs_total{instance="awx1:8013"}
hide: false
intervalMs: 1000
legendFormat: __auto
maxDataPoints: 43200
range: true
refId: pending_jobs
- refId: last_pending_jobs
queryType: ""
relativeTimeRange:
from: 0
to: 0
datasourceUid: "-100"
model:
conditions:
- evaluator:
params:
- 0
- 0
type: gt
operator:
type: and
query:
params:
- pending_jobs_and_capacity_compare
reducer:
params: []
type: avg
type: query
datasource:
name: Expression
type: __expr__
uid: __expr__
expression: pending_jobs
hide: false
intervalMs: 1000
maxDataPoints: 43200
reducer: last
refId: last_pending_jobs
type: reduce
- refId: pending_jobs_and_capacity_compare
queryType: ""
relativeTimeRange:
from: 0
to: 0
datasourceUid: "-100"
model:
conditions:
- evaluator:
params:
- 0
- 0
type: gt
operator:
type: and
query:
params:
- 10_percent_total_capacity
reducer:
params: []
type: last
type: query
- evaluator:
params:
- 0
- 0
type: gt
operator:
type: and
query:
params:
- pending_jobs
reducer:
params: []
type: last
type: query
datasource:
name: Expression
type: __expr__
uid: __expr__
expression:
"($10_percent_total_capacity > $last_remaining_capacity) && $last_pending_jobs
> 1"
hide: false
intervalMs: 1000
maxDataPoints: 43200
reducer: mean
refId: pending_jobs_and_capacity_compare
type: math
댓글