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__
|
||||
config/config.yaml
|
||||
config/text_template.tpl
|
||||
venv
|
||||
alert-*
|
||||
k8s/config
|
4
.vscode/launch.json
vendored
4
.vscode/launch.json
vendored
@ -27,7 +27,9 @@
|
||||
"args": [
|
||||
"run",
|
||||
"--no-debugger",
|
||||
"--no-reload"
|
||||
"--no-reload",
|
||||
"--host 0.0.0.0",
|
||||
"--port 5001"
|
||||
],
|
||||
"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)
|
||||
|
||||
app = Flask(__name__,
|
||||
root_path=join(dirname(abspath(__file__)), '..'))
|
||||
root_path=join(dirname(abspath(__file__)), '..'), template_folder="config")
|
||||
app.config.from_object(config)
|
||||
|
||||
app.json_encoder = JSONEncoder
|
||||
|
@ -1,8 +1,14 @@
|
||||
bark_api: http://bark-server.default:8080/push
|
||||
title:
|
||||
DEBUG: true
|
||||
|
||||
APP_CONFIG:
|
||||
bark_api: http://bark-server.default:8080/push
|
||||
title:
|
||||
firing: Homeserver 告警发生
|
||||
resolved: Homeserver 告警解除
|
||||
default: Homeserver
|
||||
to:
|
||||
- 'token'
|
||||
template_file: text_template.tpl
|
||||
to:
|
||||
- 'token'
|
||||
severity:
|
||||
- 'warning'
|
||||
- 'critical'
|
||||
template_file: text_template.tpl
|
@ -1,22 +1,41 @@
|
||||
{%- for alert in alerts -%}
|
||||
{%- if alert.status == 'firing' -%}
|
||||
{%- if status == 'firing' -%}
|
||||
告警发生:
|
||||
{%- for alert in alerts %}
|
||||
告警时间:{{alert.startsAt}}
|
||||
{% if alert.labels.instance -%}涉及实例:{{alert.labels.instance}}{%- endif %}
|
||||
{% if alert.labels.device -%}涉及设备:{{alert.labels.device}}{%- endif %}
|
||||
{% if alert.labels.instance -%}
|
||||
涉及实例:{{alert.labels.instance}}
|
||||
{% endif -%}
|
||||
{% if alert.labels.device -%}
|
||||
涉及设备:{{alert.labels.device}}
|
||||
{% endif -%}
|
||||
告警名称:{{alert.labels.alertname}}
|
||||
严重性:{{alert.labels.severity}}
|
||||
详情:{{alert.annotations.summary}}
|
||||
{% if alert.annotations.value -%}告警数据:{{alert.annotations.value}}{%- endif %}
|
||||
{%- else -%}
|
||||
详情:{{alert.annotations.description}}
|
||||
{% if alert.annotations.value -%}
|
||||
告警数据:{{alert.annotations.value}}
|
||||
{% endif -%}
|
||||
{% if alert.annotations.runbook_url -%}
|
||||
参考文档:{{alert.annotations.runbook_url}}
|
||||
{%- endif %}
|
||||
---
|
||||
{%- endfor %}
|
||||
{%- else -%}
|
||||
告警恢复:
|
||||
{%- for alert in alerts %}
|
||||
告警时间:{{alert.startsAt}}
|
||||
恢复时间:{{alert.endsAt}}
|
||||
{% if alert.labels.instance -%}涉及实例:{{alert.labels.instance}}{%- endif %}
|
||||
{% if alert.labels.device -%}涉及设备:{{alert.labels.device}}{%- endif %}
|
||||
{% if alert.labels.instance -%}
|
||||
涉及实例:{{alert.labels.instance}}
|
||||
{%- endif %}
|
||||
{% if alert.labels.device -%}
|
||||
涉及设备:{{alert.labels.device}}
|
||||
{%- endif %}
|
||||
告警名称:{{alert.labels.alertname}}
|
||||
严重性:{{alert.labels.severity}}
|
||||
详情:{{alert.annotations.summary}}
|
||||
{% if alert.annotations.value -%}告警数据:{{alert.annotations.value}}{%- endif %}
|
||||
{%- endif -%}
|
||||
{%- endfor -%}
|
||||
{% if alert.annotations.value -%}
|
||||
告警数据:{{alert.annotations.value}}
|
||||
{%- 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
|
||||
certifi==2022.6.15
|
||||
charset-normalizer==2.1.0
|
||||
click==8.1.3
|
||||
Flask==2.1.3
|
||||
charset-normalizer==2.0.12
|
||||
click==8.0.4
|
||||
dataclasses==0.8
|
||||
Flask==2.0.3
|
||||
Flask-RESTful==0.3.9
|
||||
idna==3.3
|
||||
importlib-metadata==4.12.0
|
||||
itsdangerous==2.1.2
|
||||
Jinja2==3.1.2
|
||||
MarkupSafe==2.1.1
|
||||
importlib-metadata==4.8.3
|
||||
itsdangerous==2.0.1
|
||||
Jinja2==3.0.3
|
||||
MarkupSafe==2.0.1
|
||||
munch==2.5.0
|
||||
pkg_resources==0.0.0
|
||||
Paste==3.5.1
|
||||
pytz==2022.1
|
||||
PyYAML==6.0
|
||||
requests==2.28.1
|
||||
requests==2.27.1
|
||||
six==1.16.0
|
||||
typing_extensions==4.1.1
|
||||
urllib3==1.26.11
|
||||
Werkzeug==2.2.1
|
||||
zipp==3.8.1
|
||||
waitress==2.0.0
|
||||
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 utils.error_handler import error_handler
|
||||
from app.app import app
|
||||
@ -11,11 +11,12 @@ class BarkResource(Resource):
|
||||
try:
|
||||
data = Munch.fromDict(request.get_json(silent=True))
|
||||
app.logger.debug(data)
|
||||
config = Munch.fromDict(app.config)
|
||||
content = {
|
||||
config = Munch.fromDict(app.config["APP_CONFIG"])
|
||||
|
||||
content = Munch.fromDict({
|
||||
'title': config.title.firing if data.status == 'firing' else config.title.resolved if data.status == 'resolved' else config.title.default,
|
||||
'category': 'category'
|
||||
}
|
||||
})
|
||||
|
||||
# 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)
|
||||
for to in config.to:
|
||||
content['device_key'] = to
|
||||
content.device_key = to
|
||||
response = requests.post(
|
||||
url = config.bark_api,
|
||||
headers = {
|
||||
|
Loading…
Reference in New Issue
Block a user