ready for build

This commit is contained in:
qiqian 2022-08-15 13:51:23 +08:00
parent 2a15d631e1
commit 8fa3ac851c
15 changed files with 260 additions and 40 deletions

65
.drone.yaml Normal file
View 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
View File

@ -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
View File

@ -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
View 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

View File

@ -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

View File

@ -1,3 +1,6 @@
DEBUG: true
APP_CONFIG:
bark_api: http://bark-server.default:8080/push bark_api: http://bark-server.default:8080/push
title: title:
firing: Homeserver 告警发生 firing: Homeserver 告警发生
@ -5,4 +8,7 @@ title:
default: Homeserver default: Homeserver
to: to:
- 'token' - 'token'
severity:
- 'warning'
- 'critical'
template_file: text_template.tpl template_file: text_template.tpl

View File

@ -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 -%}
告警数据:{{alert.annotations.value}}
{% endif -%}
{% if alert.annotations.runbook_url -%}
参考文档:{{alert.annotations.runbook_url}}
{%- endif %}
---
{%- endfor %}
{%- else -%} {%- 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 -%}
告警数据:{{alert.annotations.value}}
{%- endif %}
---
{%- endfor %}
{%- endif -%} {%- endif -%}
{%- endfor -%}

35
k8s/base/deployment.yaml Normal file
View 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
View 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
View 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
View File

@ -0,0 +1,12 @@
kind: Deployment
metadata:
name: alertmanager-webhook
spec:
selector:
matchLabels:
app: alertmanager-webhook
template:
spec:
containers:
- name: alertmanager-webhook
resources: {}

View File

@ -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
View 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)

View File

@ -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 = {

6
wsgi.py Normal file
View File

@ -0,0 +1,6 @@
from app import app
from paste.translogger import TransLogger
from logging import INFO
def run():
return TransLogger(app, logger_name='webhook', logging_level=INFO)