From 949720b76a3eb517c70ce6994c702f128e2f0d74 Mon Sep 17 00:00:00 2001 From: okxlin Date: Thu, 6 Jul 2023 22:28:33 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E6=B7=BB=E5=8A=A0prometheus=E5=88=B0?= =?UTF-8?q?=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/prometheus/2.45.0/.env.sample | 2 + apps/prometheus/2.45.0/data.yml | 11 ++ apps/prometheus/2.45.0/data/prometheus.yml | 29 +++ apps/prometheus/2.45.0/docker-compose.yml | 18 ++ apps/prometheus/README.md | 197 +++++++++++++++++++++ apps/prometheus/data.yml.bak | 20 +++ apps/prometheus/latest/.env.sample | 2 + apps/prometheus/latest/data.yml | 11 ++ apps/prometheus/latest/data/prometheus.yml | 29 +++ apps/prometheus/latest/docker-compose.yml | 18 ++ apps/prometheus/logo.png | Bin 0 -> 5765 bytes 11 files changed, 337 insertions(+) create mode 100644 apps/prometheus/2.45.0/.env.sample create mode 100644 apps/prometheus/2.45.0/data.yml create mode 100644 apps/prometheus/2.45.0/data/prometheus.yml create mode 100644 apps/prometheus/2.45.0/docker-compose.yml create mode 100644 apps/prometheus/README.md create mode 100644 apps/prometheus/data.yml.bak create mode 100644 apps/prometheus/latest/.env.sample create mode 100644 apps/prometheus/latest/data.yml create mode 100644 apps/prometheus/latest/data/prometheus.yml create mode 100644 apps/prometheus/latest/docker-compose.yml create mode 100644 apps/prometheus/logo.png diff --git a/apps/prometheus/2.45.0/.env.sample b/apps/prometheus/2.45.0/.env.sample new file mode 100644 index 00000000..97fb2953 --- /dev/null +++ b/apps/prometheus/2.45.0/.env.sample @@ -0,0 +1,2 @@ +CONTAINER_NAME="grafana" +PANEL_APP_PORT_HTTP="40039" \ No newline at end of file diff --git a/apps/prometheus/2.45.0/data.yml b/apps/prometheus/2.45.0/data.yml new file mode 100644 index 00000000..4aba8b49 --- /dev/null +++ b/apps/prometheus/2.45.0/data.yml @@ -0,0 +1,11 @@ +additionalProperties: + formFields: + - default: 40039 + edit: true + envKey: PANEL_APP_PORT_HTTP + labelEn: Port + labelZh: 端口 + required: true + rule: paramPort + type: number + diff --git a/apps/prometheus/2.45.0/data/prometheus.yml b/apps/prometheus/2.45.0/data/prometheus.yml new file mode 100644 index 00000000..c7264547 --- /dev/null +++ b/apps/prometheus/2.45.0/data/prometheus.yml @@ -0,0 +1,29 @@ +# my global config +global: + scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute. + evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute. + # scrape_timeout is set to the global default (10s). + +# Alertmanager configuration +alerting: + alertmanagers: + - static_configs: + - targets: + # - alertmanager:9093 + +# Load rules once and periodically evaluate them according to the global 'evaluation_interval'. +rule_files: + # - "first_rules.yml" + # - "second_rules.yml" + +# A scrape configuration containing exactly one endpoint to scrape: +# Here it's Prometheus itself. +scrape_configs: + # The job name is added as a label `job=` to any timeseries scraped from this config. + - job_name: "prometheus" + + # metrics_path defaults to '/metrics' + # scheme defaults to 'http'. + + static_configs: + - targets: ["localhost:9090"] \ No newline at end of file diff --git a/apps/prometheus/2.45.0/docker-compose.yml b/apps/prometheus/2.45.0/docker-compose.yml new file mode 100644 index 00000000..372ce51a --- /dev/null +++ b/apps/prometheus/2.45.0/docker-compose.yml @@ -0,0 +1,18 @@ +version: '3' +services: + prometheus: + container_name: ${CONTAINER_NAME} + restart: always + networks: + - 1panel-network + ports: + - "${PANEL_APP_PORT_HTTP}:9090" + volumes: + - "./data:/etc/prometheus" + image: prom/prometheus:v2.45.0 + labels: + createdBy: "Apps" + +networks: + 1panel-network: + external: true diff --git a/apps/prometheus/README.md b/apps/prometheus/README.md new file mode 100644 index 00000000..6df07785 --- /dev/null +++ b/apps/prometheus/README.md @@ -0,0 +1,197 @@ +# 使用说明 + +需要按需配置应用目录下`data`文件夹里的`prometheus.yml`,以自定义更多功能。 + + +# 原始相关 + +

+ Prometheus
Prometheus +

+ +

Visit prometheus.io for the full documentation, +examples and guides.

+ +
+ +[![CI](https://github.com/prometheus/prometheus/actions/workflows/ci.yml/badge.svg)](https://github.com/prometheus/prometheus/actions/workflows/ci.yml) +[![Docker Repository on Quay](https://quay.io/repository/prometheus/prometheus/status)][quay] +[![Docker Pulls](https://img.shields.io/docker/pulls/prom/prometheus.svg?maxAge=604800)][hub] +[![Go Report Card](https://goreportcard.com/badge/github.com/prometheus/prometheus)](https://goreportcard.com/report/github.com/prometheus/prometheus) +[![CII Best Practices](https://bestpractices.coreinfrastructure.org/projects/486/badge)](https://bestpractices.coreinfrastructure.org/projects/486) +[![Gitpod ready-to-code](https://img.shields.io/badge/Gitpod-ready--to--code-blue?logo=gitpod)](https://gitpod.io/#https://github.com/prometheus/prometheus) +[![Fuzzing Status](https://oss-fuzz-build-logs.storage.googleapis.com/badges/prometheus.svg)](https://bugs.chromium.org/p/oss-fuzz/issues/list?sort=-opened&can=1&q=proj:prometheus) + +
+ +Prometheus, a [Cloud Native Computing Foundation](https://cncf.io/) project, is a systems and service monitoring system. It collects metrics +from configured targets at given intervals, evaluates rule expressions, +displays the results, and can trigger alerts when specified conditions are observed. + +The features that distinguish Prometheus from other metrics and monitoring systems are: + +* A **multi-dimensional** data model (time series defined by metric name and set of key/value dimensions) +* PromQL, a **powerful and flexible query language** to leverage this dimensionality +* No dependency on distributed storage; **single server nodes are autonomous** +* An HTTP **pull model** for time series collection +* **Pushing time series** is supported via an intermediary gateway for batch jobs +* Targets are discovered via **service discovery** or **static configuration** +* Multiple modes of **graphing and dashboarding support** +* Support for hierarchical and horizontal **federation** + +## Architecture overview + +![Architecture overview](https://raw.githubusercontent.com/prometheus/prometheus/main/documentation/images/architecture.svg) + +## Install + +There are various ways of installing Prometheus. + +### Precompiled binaries + +Precompiled binaries for released versions are available in the +[*download* section](https://prometheus.io/download/) +on [prometheus.io](https://prometheus.io). Using the latest production release binary +is the recommended way of installing Prometheus. +See the [Installing](https://prometheus.io/docs/introduction/install/) +chapter in the documentation for all the details. + +### Docker images + +Docker images are available on [Quay.io](https://quay.io/repository/prometheus/prometheus) or [Docker Hub](https://hub.docker.com/r/prom/prometheus/). + +You can launch a Prometheus container for trying it out with + +```bash +docker run --name prometheus -d -p 127.0.0.1:9090:9090 prom/prometheus +``` + +Prometheus will now be reachable at . + +### Building from source + +To build Prometheus from source code, You need: + +* Go [version 1.17 or greater](https://golang.org/doc/install). +* NodeJS [version 16 or greater](https://nodejs.org/). +* npm [version 7 or greater](https://www.npmjs.com/). + +Start by cloning the repository: + +```bash +git clone https://github.com/prometheus/prometheus.git +cd prometheus +``` + +You can use the `go` tool to build and install the `prometheus` +and `promtool` binaries into your `GOPATH`: + +```bash +GO111MODULE=on go install github.com/prometheus/prometheus/cmd/... +prometheus --config.file=your_config.yml +``` + +*However*, when using `go install` to build Prometheus, Prometheus will expect to be able to +read its web assets from local filesystem directories under `web/ui/static` and +`web/ui/templates`. In order for these assets to be found, you will have to run Prometheus +from the root of the cloned repository. Note also that these directories do not include the +React UI unless it has been built explicitly using `make assets` or `make build`. + +An example of the above configuration file can be found [here.](https://github.com/prometheus/prometheus/blob/main/documentation/examples/prometheus.yml) + +You can also build using `make build`, which will compile in the web assets so that +Prometheus can be run from anywhere: + +```bash +make build +./prometheus --config.file=your_config.yml +``` + +The Makefile provides several targets: + +* *build*: build the `prometheus` and `promtool` binaries (includes building and compiling in web assets) +* *test*: run the tests +* *test-short*: run the short tests +* *format*: format the source code +* *vet*: check the source code for common errors +* *assets*: build the React UI + +### Service discovery plugins + +Prometheus is bundled with many service discovery plugins. +When building Prometheus from source, you can edit the [plugins.yml](./plugins.yml) +file to disable some service discoveries. The file is a yaml-formated list of go +import path that will be built into the Prometheus binary. + +After you have changed the file, you +need to run `make build` again. + +If you are using another method to compile Prometheus, `make plugins` will +generate the plugins file accordingly. + +If you add out-of-tree plugins, which we do not endorse at the moment, +additional steps might be needed to adjust the `go.mod` and `go.sum` files. As +always, be extra careful when loading third party code. + +### Building the Docker image + +The `make docker` target is designed for use in our CI system. +You can build a docker image locally with the following commands: + +```bash +make promu +promu crossbuild -p linux/amd64 +make npm_licenses +make common-docker-amd64 +``` + +## Using Prometheus as a Go Library + +### Remote Write + +We are publishing our Remote Write protobuf independently at +[buf.build](https://buf.build/prometheus/prometheus/assets). + +You can use that as a library: + +```shell +go get go.buf.build/protocolbuffers/go/prometheus/prometheus +``` + +This is experimental. + +### Prometheus code base + +In order to comply with [go mod](https://go.dev/ref/mod#versions) rules, +Prometheus release number do not exactly match Go module releases. For the +Prometheus v2.y.z releases, we are publishing equivalent v0.y.z tags. + +Therefore, a user that would want to use Prometheus v2.35.0 as a library could do: + +```shell +go get github.com/prometheus/prometheus@v0.35.0 +``` + +This solution makes it clear that we might break our internal Go APIs between +minor user-facing releases, as [breaking changes are allowed in major version +zero](https://semver.org/#spec-item-4). + +## React UI Development + +For more information on building, running, and developing on the React-based UI, see the React app's [README.md](web/ui/README.md). + +## More information + +* Godoc documentation is available via [pkg.go.dev](https://pkg.go.dev/github.com/prometheus/prometheus). Due to peculiarities of Go Modules, v2.x.y will be displayed as v0.x.y. +* See the [Community page](https://prometheus.io/community) for how to reach the Prometheus developers and users on various communication channels. + +## Contributing + +Refer to [CONTRIBUTING.md](https://github.com/prometheus/prometheus/blob/main/CONTRIBUTING.md) + +## License + +Apache License 2.0, see [LICENSE](https://github.com/prometheus/prometheus/blob/main/LICENSE). + +[hub]: https://hub.docker.com/r/prom/prometheus/ +[quay]: https://quay.io/repository/prometheus/prometheus diff --git a/apps/prometheus/data.yml.bak b/apps/prometheus/data.yml.bak new file mode 100644 index 00000000..0292929c --- /dev/null +++ b/apps/prometheus/data.yml.bak @@ -0,0 +1,20 @@ +name: Prometheus +tags: + - 工具 +title: 一个系统和服务监控系统 +type: 工具 +description: 一个系统和服务监控系统 +additionalProperties: + key: prometheus + name: Prometheus + tags: + - Tool + shortDescZh: 一个系统和服务监控系统 + shortDescEn: A systems and service monitoring system + type: tool + crossVersionUpdate: true + limit: 0 + recommend: 0 + website: https://prometheus.io/ + github: https://github.com/prometheus/prometheus + document: https://prometheus.io/docs/ \ No newline at end of file diff --git a/apps/prometheus/latest/.env.sample b/apps/prometheus/latest/.env.sample new file mode 100644 index 00000000..97fb2953 --- /dev/null +++ b/apps/prometheus/latest/.env.sample @@ -0,0 +1,2 @@ +CONTAINER_NAME="grafana" +PANEL_APP_PORT_HTTP="40039" \ No newline at end of file diff --git a/apps/prometheus/latest/data.yml b/apps/prometheus/latest/data.yml new file mode 100644 index 00000000..4aba8b49 --- /dev/null +++ b/apps/prometheus/latest/data.yml @@ -0,0 +1,11 @@ +additionalProperties: + formFields: + - default: 40039 + edit: true + envKey: PANEL_APP_PORT_HTTP + labelEn: Port + labelZh: 端口 + required: true + rule: paramPort + type: number + diff --git a/apps/prometheus/latest/data/prometheus.yml b/apps/prometheus/latest/data/prometheus.yml new file mode 100644 index 00000000..c7264547 --- /dev/null +++ b/apps/prometheus/latest/data/prometheus.yml @@ -0,0 +1,29 @@ +# my global config +global: + scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute. + evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute. + # scrape_timeout is set to the global default (10s). + +# Alertmanager configuration +alerting: + alertmanagers: + - static_configs: + - targets: + # - alertmanager:9093 + +# Load rules once and periodically evaluate them according to the global 'evaluation_interval'. +rule_files: + # - "first_rules.yml" + # - "second_rules.yml" + +# A scrape configuration containing exactly one endpoint to scrape: +# Here it's Prometheus itself. +scrape_configs: + # The job name is added as a label `job=` to any timeseries scraped from this config. + - job_name: "prometheus" + + # metrics_path defaults to '/metrics' + # scheme defaults to 'http'. + + static_configs: + - targets: ["localhost:9090"] \ No newline at end of file diff --git a/apps/prometheus/latest/docker-compose.yml b/apps/prometheus/latest/docker-compose.yml new file mode 100644 index 00000000..4d5b41df --- /dev/null +++ b/apps/prometheus/latest/docker-compose.yml @@ -0,0 +1,18 @@ +version: '3' +services: + prometheus: + container_name: ${CONTAINER_NAME} + restart: always + networks: + - 1panel-network + ports: + - "${PANEL_APP_PORT_HTTP}:9090" + volumes: + - "./data:/etc/prometheus" + image: prom/prometheus:latest + labels: + createdBy: "Apps" + +networks: + 1panel-network: + external: true diff --git a/apps/prometheus/logo.png b/apps/prometheus/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..0449f5f5b04d8ea3534b9c4c793734373a2dbe30 GIT binary patch literal 5765 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 DG`Y|H literal 0 HcmV?d00001