ready for build
This commit is contained in:
parent
2a15d631e1
commit
8fa3ac851c
65
.drone.yaml
Normal file
65
.drone.yaml
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
|
||||||
|
kind: pipeline
|
||||||
|
type: docker
|
||||||
|
name: build
|
||||||
|
|
||||||
|
clone:
|
||||||
|
disable: true
|
||||||
|
|
||||||
|
trigger:
|
||||||
|
ref:
|
||||||
|
- refs/tags/**
|
||||||
|
- refs/heads/master
|
||||||
|
event:
|
||||||
|
- tag
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: clone
|
||||||
|
image: alpine/git
|
||||||
|
environment:
|
||||||
|
SSH_PRIVATE_KEY:
|
||||||
|
from_secret: ssh_private_key
|
||||||
|
commands:
|
||||||
|
- umask 077
|
||||||
|
- mkdir -p /root/.ssh/
|
||||||
|
- echo "$$SSH_PRIVATE_KEY" > /root/.ssh/id_rsa
|
||||||
|
- ssh-keyscan -t rsa -p 2222 git.hxjscloud.com >> ~/.ssh/known_hosts
|
||||||
|
- test $${DRONE_TAG} && git clone --branch $DRONE_TAG $DRONE_GIT_SSH_URL .
|
||||||
|
- test $${DRONE_TAG} || git clone --branch $DRONE_BRANCH $DRONE_GIT_SSH_URL .
|
||||||
|
- SHORT_COMMIT_ID=$${DRONE_COMMIT:0-8}
|
||||||
|
- TAG_LIST="latest"
|
||||||
|
- test $${DRONE_TAG} && TAG_LIST="$${TAG_LIST},$${DRONE_TAG}"
|
||||||
|
- test $${DRONE_TAG} || TAG_LIST="$${TAG_LIST},snapshot-$(date +%Y%m%d)-$${SHORT_COMMIT_ID}"
|
||||||
|
- echo $${TAG_LIST} > .tags
|
||||||
|
|
||||||
|
- name: build
|
||||||
|
image: plugins/docker
|
||||||
|
settings:
|
||||||
|
auto_tag: true
|
||||||
|
repo: harbor.hxjscloud.com/ops/alertmanager-webhook
|
||||||
|
registry: harbor.hxjscloud.com
|
||||||
|
username:
|
||||||
|
from_secret: docker_username
|
||||||
|
password:
|
||||||
|
from_secret: docker_password
|
||||||
|
|
||||||
|
---
|
||||||
|
kind: secret
|
||||||
|
name: ssh_private_key
|
||||||
|
get:
|
||||||
|
path: kv/data/drone-ci
|
||||||
|
name: deploy_ssh_private_key
|
||||||
|
|
||||||
|
---
|
||||||
|
kind: secret
|
||||||
|
name: docker_username
|
||||||
|
get:
|
||||||
|
path: kv/data/drone-ci
|
||||||
|
name: registry_username
|
||||||
|
|
||||||
|
---
|
||||||
|
kind: secret
|
||||||
|
name: docker_password
|
||||||
|
get:
|
||||||
|
path: kv/data/drone-ci
|
||||||
|
name: registry_password
|
3
.gitignore
vendored
3
.gitignore
vendored
@ -2,3 +2,6 @@
|
|||||||
__pycache__
|
__pycache__
|
||||||
config/config.yaml
|
config/config.yaml
|
||||||
config/text_template.tpl
|
config/text_template.tpl
|
||||||
|
venv
|
||||||
|
alert-*
|
||||||
|
k8s/config
|
4
.vscode/launch.json
vendored
4
.vscode/launch.json
vendored
@ -27,7 +27,9 @@
|
|||||||
"args": [
|
"args": [
|
||||||
"run",
|
"run",
|
||||||
"--no-debugger",
|
"--no-debugger",
|
||||||
"--no-reload"
|
"--no-reload",
|
||||||
|
"--host 0.0.0.0",
|
||||||
|
"--port 5001"
|
||||||
],
|
],
|
||||||
"jinja": true
|
"jinja": true
|
||||||
}
|
}
|
||||||
|
17
Dockerfile
Normal file
17
Dockerfile
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
FROM harbor.hxjscloud.com/library/python:3-alpine as builder
|
||||||
|
USER root
|
||||||
|
#RUN apk add --no-cache rust cargo python3-dev libffi-dev
|
||||||
|
USER app
|
||||||
|
COPY --chown=app:app . ./webhook/
|
||||||
|
WORKDIR /app/webhook
|
||||||
|
RUN python3 -m venv venv &&\
|
||||||
|
source venv/bin/activate &&\
|
||||||
|
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple --upgrade pip && \
|
||||||
|
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt && ls -alh
|
||||||
|
|
||||||
|
FROM harbor.hxjscloud.com/library/python:3-alpine
|
||||||
|
#RUN apk add --no-cache libffi
|
||||||
|
COPY --chown=app:app --from=builder /app/webhook/ ./webhook
|
||||||
|
WORKDIR /app/webhook
|
||||||
|
CMD source /app/webhook/venv/bin/activate &&\
|
||||||
|
MODE=prod waitress-serve --ident="webhook" --connection-limit=500 --call wsgi:run
|
@ -15,7 +15,7 @@ for k, v in config_yaml.items():
|
|||||||
setattr(config, k, v)
|
setattr(config, k, v)
|
||||||
|
|
||||||
app = Flask(__name__,
|
app = Flask(__name__,
|
||||||
root_path=join(dirname(abspath(__file__)), '..'))
|
root_path=join(dirname(abspath(__file__)), '..'), template_folder="config")
|
||||||
app.config.from_object(config)
|
app.config.from_object(config)
|
||||||
|
|
||||||
app.json_encoder = JSONEncoder
|
app.json_encoder = JSONEncoder
|
||||||
|
@ -1,8 +1,14 @@
|
|||||||
bark_api: http://bark-server.default:8080/push
|
DEBUG: true
|
||||||
title:
|
|
||||||
firing: Homeserver 告警发生
|
APP_CONFIG:
|
||||||
resolved: Homeserver 告警解除
|
bark_api: http://bark-server.default:8080/push
|
||||||
default: Homeserver
|
title:
|
||||||
to:
|
firing: Homeserver 告警发生
|
||||||
- 'token'
|
resolved: Homeserver 告警解除
|
||||||
template_file: text_template.tpl
|
default: Homeserver
|
||||||
|
to:
|
||||||
|
- 'token'
|
||||||
|
severity:
|
||||||
|
- 'warning'
|
||||||
|
- 'critical'
|
||||||
|
template_file: text_template.tpl
|
@ -1,22 +1,41 @@
|
|||||||
{%- for alert in alerts -%}
|
{%- if status == 'firing' -%}
|
||||||
{%- if alert.status == 'firing' -%}
|
|
||||||
告警发生:
|
告警发生:
|
||||||
|
{%- for alert in alerts %}
|
||||||
告警时间:{{alert.startsAt}}
|
告警时间:{{alert.startsAt}}
|
||||||
{% if alert.labels.instance -%}涉及实例:{{alert.labels.instance}}{%- endif %}
|
{% if alert.labels.instance -%}
|
||||||
{% if alert.labels.device -%}涉及设备:{{alert.labels.device}}{%- endif %}
|
涉及实例:{{alert.labels.instance}}
|
||||||
|
{% endif -%}
|
||||||
|
{% if alert.labels.device -%}
|
||||||
|
涉及设备:{{alert.labels.device}}
|
||||||
|
{% endif -%}
|
||||||
告警名称:{{alert.labels.alertname}}
|
告警名称:{{alert.labels.alertname}}
|
||||||
严重性:{{alert.labels.severity}}
|
严重性:{{alert.labels.severity}}
|
||||||
详情:{{alert.annotations.summary}}
|
详情:{{alert.annotations.description}}
|
||||||
{% if alert.annotations.value -%}告警数据:{{alert.annotations.value}}{%- endif %}
|
{% if alert.annotations.value -%}
|
||||||
{%- else -%}
|
告警数据:{{alert.annotations.value}}
|
||||||
|
{% endif -%}
|
||||||
|
{% if alert.annotations.runbook_url -%}
|
||||||
|
参考文档:{{alert.annotations.runbook_url}}
|
||||||
|
{%- endif %}
|
||||||
|
---
|
||||||
|
{%- endfor %}
|
||||||
|
{%- else -%}
|
||||||
告警恢复:
|
告警恢复:
|
||||||
|
{%- for alert in alerts %}
|
||||||
告警时间:{{alert.startsAt}}
|
告警时间:{{alert.startsAt}}
|
||||||
恢复时间:{{alert.endsAt}}
|
恢复时间:{{alert.endsAt}}
|
||||||
{% if alert.labels.instance -%}涉及实例:{{alert.labels.instance}}{%- endif %}
|
{% if alert.labels.instance -%}
|
||||||
{% if alert.labels.device -%}涉及设备:{{alert.labels.device}}{%- endif %}
|
涉及实例:{{alert.labels.instance}}
|
||||||
|
{%- endif %}
|
||||||
|
{% if alert.labels.device -%}
|
||||||
|
涉及设备:{{alert.labels.device}}
|
||||||
|
{%- endif %}
|
||||||
告警名称:{{alert.labels.alertname}}
|
告警名称:{{alert.labels.alertname}}
|
||||||
严重性:{{alert.labels.severity}}
|
严重性:{{alert.labels.severity}}
|
||||||
详情:{{alert.annotations.summary}}
|
详情:{{alert.annotations.summary}}
|
||||||
{% if alert.annotations.value -%}告警数据:{{alert.annotations.value}}{%- endif %}
|
{% if alert.annotations.value -%}
|
||||||
{%- endif -%}
|
告警数据:{{alert.annotations.value}}
|
||||||
{%- endfor -%}
|
{%- endif %}
|
||||||
|
---
|
||||||
|
{%- endfor %}
|
||||||
|
{%- endif -%}
|
35
k8s/base/deployment.yaml
Normal file
35
k8s/base/deployment.yaml
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
apiVersion: apps/v1
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
name: alertmanager-webhook
|
||||||
|
spec:
|
||||||
|
selector:
|
||||||
|
matchLabels:
|
||||||
|
app: alertmanager-webhook
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app: alertmanager-webhook
|
||||||
|
spec:
|
||||||
|
volumes:
|
||||||
|
- name: config
|
||||||
|
configMap:
|
||||||
|
name: alertmanager-webhook
|
||||||
|
containers:
|
||||||
|
- name: alertmanager-webhook
|
||||||
|
volumeMounts:
|
||||||
|
- mountPath: /app/webhook/config
|
||||||
|
name: config
|
||||||
|
image: webhook
|
||||||
|
ports:
|
||||||
|
- containerPort: 8080
|
||||||
|
name: web
|
||||||
|
readinessProbe:
|
||||||
|
httpGet:
|
||||||
|
port: web
|
||||||
|
path: /health
|
||||||
|
livenessProbe:
|
||||||
|
httpGet:
|
||||||
|
port: web
|
||||||
|
path: /health
|
||||||
|
initialDelaySeconds: 10
|
11
k8s/base/service.yaml
Normal file
11
k8s/base/service.yaml
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
apiVersion: v1
|
||||||
|
kind: Service
|
||||||
|
metadata:
|
||||||
|
name: alertmanager-webhook
|
||||||
|
spec:
|
||||||
|
selector:
|
||||||
|
app: alertmanager-webhook
|
||||||
|
ports:
|
||||||
|
- port: 8080
|
||||||
|
protocol: TCP
|
||||||
|
targetPort: web
|
23
k8s/kustomization.yaml
Normal file
23
k8s/kustomization.yaml
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
# yaml-language-server: $schema=https://json.schemastore.org/kustomization.json
|
||||||
|
|
||||||
|
apiVersion: kustomize.config.k8s.io/v1beta1
|
||||||
|
kind: Kustomization
|
||||||
|
resources:
|
||||||
|
- base/deployment.yaml
|
||||||
|
- base/service.yaml
|
||||||
|
commonLabels:
|
||||||
|
app: alertmanager-webhook
|
||||||
|
configMapGenerator:
|
||||||
|
- name: alertmanager-webhook
|
||||||
|
files:
|
||||||
|
- config/config.yaml
|
||||||
|
- config/text_template.tpl
|
||||||
|
images:
|
||||||
|
- name: webhook
|
||||||
|
newName: ''
|
||||||
|
newTag: ''
|
||||||
|
patches:
|
||||||
|
- path: overlay.yaml
|
||||||
|
target:
|
||||||
|
kind: Deployment
|
||||||
|
labelSelector: app=alertmanager-webhook
|
12
k8s/overlay.yaml
Normal file
12
k8s/overlay.yaml
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
name: alertmanager-webhook
|
||||||
|
spec:
|
||||||
|
selector:
|
||||||
|
matchLabels:
|
||||||
|
app: alertmanager-webhook
|
||||||
|
template:
|
||||||
|
spec:
|
||||||
|
containers:
|
||||||
|
- name: alertmanager-webhook
|
||||||
|
resources: {}
|
@ -1,20 +1,23 @@
|
|||||||
aniso8601==9.0.1
|
aniso8601==9.0.1
|
||||||
certifi==2022.6.15
|
certifi==2022.6.15
|
||||||
charset-normalizer==2.1.0
|
charset-normalizer==2.0.12
|
||||||
click==8.1.3
|
click==8.0.4
|
||||||
Flask==2.1.3
|
dataclasses==0.8
|
||||||
|
Flask==2.0.3
|
||||||
Flask-RESTful==0.3.9
|
Flask-RESTful==0.3.9
|
||||||
idna==3.3
|
idna==3.3
|
||||||
importlib-metadata==4.12.0
|
importlib-metadata==4.8.3
|
||||||
itsdangerous==2.1.2
|
itsdangerous==2.0.1
|
||||||
Jinja2==3.1.2
|
Jinja2==3.0.3
|
||||||
MarkupSafe==2.1.1
|
MarkupSafe==2.0.1
|
||||||
munch==2.5.0
|
munch==2.5.0
|
||||||
pkg_resources==0.0.0
|
Paste==3.5.1
|
||||||
pytz==2022.1
|
pytz==2022.1
|
||||||
PyYAML==6.0
|
PyYAML==6.0
|
||||||
requests==2.28.1
|
requests==2.27.1
|
||||||
six==1.16.0
|
six==1.16.0
|
||||||
|
typing_extensions==4.1.1
|
||||||
urllib3==1.26.11
|
urllib3==1.26.11
|
||||||
Werkzeug==2.2.1
|
waitress==2.0.0
|
||||||
zipp==3.8.1
|
Werkzeug==2.0.3
|
||||||
|
zipp==3.6.0
|
||||||
|
16
test.py
Normal file
16
test.py
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
from flask import Flask, render_template
|
||||||
|
import json
|
||||||
|
|
||||||
|
app = Flask("test", template_folder="config")
|
||||||
|
data = {}
|
||||||
|
|
||||||
|
with open("alert-test.json") as f:
|
||||||
|
data = json.load(f)
|
||||||
|
|
||||||
|
@app.route("/")
|
||||||
|
def index():
|
||||||
|
return render_template("text_template.tpl", **data)
|
||||||
|
|
||||||
|
app.run(host="127.0.0.1", port=5003)
|
@ -1,4 +1,4 @@
|
|||||||
from flask import request
|
from flask import request, render_template
|
||||||
from flask_restful import Resource
|
from flask_restful import Resource
|
||||||
from utils.error_handler import error_handler
|
from utils.error_handler import error_handler
|
||||||
from app.app import app
|
from app.app import app
|
||||||
@ -11,11 +11,12 @@ class BarkResource(Resource):
|
|||||||
try:
|
try:
|
||||||
data = Munch.fromDict(request.get_json(silent=True))
|
data = Munch.fromDict(request.get_json(silent=True))
|
||||||
app.logger.debug(data)
|
app.logger.debug(data)
|
||||||
config = Munch.fromDict(app.config)
|
config = Munch.fromDict(app.config["APP_CONFIG"])
|
||||||
content = {
|
|
||||||
|
content = Munch.fromDict({
|
||||||
'title': config.title.firing if data.status == 'firing' else config.title.resolved if data.status == 'resolved' else config.title.default,
|
'title': config.title.firing if data.status == 'firing' else config.title.resolved if data.status == 'resolved' else config.title.default,
|
||||||
'category': 'category'
|
'category': 'category'
|
||||||
}
|
})
|
||||||
|
|
||||||
# TODO: alertmanager message to bark content.
|
# TODO: alertmanager message to bark content.
|
||||||
'''
|
'''
|
||||||
@ -43,10 +44,11 @@ class BarkResource(Resource):
|
|||||||
]
|
]
|
||||||
}
|
}
|
||||||
'''
|
'''
|
||||||
content.body = app.jinja_environment.get_template(config.template_file).render(data)
|
content.body = render_template(config.template_file, **data)
|
||||||
|
|
||||||
app.logger.debug(content.body)
|
app.logger.debug(content.body)
|
||||||
for to in config.to:
|
for to in config.to:
|
||||||
content['device_key'] = to
|
content.device_key = to
|
||||||
response = requests.post(
|
response = requests.post(
|
||||||
url = config.bark_api,
|
url = config.bark_api,
|
||||||
headers = {
|
headers = {
|
||||||
|
Loading…
Reference in New Issue
Block a user