flexmetric 0.5.1__tar.gz → 0.5.3__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (25) hide show
  1. {flexmetric-0.5.1 → flexmetric-0.5.3}/PKG-INFO +101 -40
  2. {flexmetric-0.5.1 → flexmetric-0.5.3}/README.md +99 -39
  3. {flexmetric-0.5.1 → flexmetric-0.5.3}/flexmetric/metric_process/database_connections.py +45 -1
  4. {flexmetric-0.5.1 → flexmetric-0.5.3}/flexmetric/metric_process/database_processing.py +10 -4
  5. {flexmetric-0.5.1 → flexmetric-0.5.3}/flexmetric/metric_process/queries_execution.py +16 -0
  6. {flexmetric-0.5.1 → flexmetric-0.5.3}/flexmetric.egg-info/PKG-INFO +101 -40
  7. {flexmetric-0.5.1 → flexmetric-0.5.3}/flexmetric.egg-info/requires.txt +1 -0
  8. {flexmetric-0.5.1 → flexmetric-0.5.3}/setup.py +3 -2
  9. {flexmetric-0.5.1 → flexmetric-0.5.3}/flexmetric/__init__.py +0 -0
  10. {flexmetric-0.5.1 → flexmetric-0.5.3}/flexmetric/config/__init__.py +0 -0
  11. {flexmetric-0.5.1 → flexmetric-0.5.3}/flexmetric/config/configuration.py +0 -0
  12. {flexmetric-0.5.1 → flexmetric-0.5.3}/flexmetric/file_recognition/__init__.py +0 -0
  13. {flexmetric-0.5.1 → flexmetric-0.5.3}/flexmetric/file_recognition/exec_file.py +0 -0
  14. {flexmetric-0.5.1 → flexmetric-0.5.3}/flexmetric/logging_module/__init__.py +0 -0
  15. {flexmetric-0.5.1 → flexmetric-0.5.3}/flexmetric/logging_module/logger.py +0 -0
  16. {flexmetric-0.5.1 → flexmetric-0.5.3}/flexmetric/metric_process/__init__.py +0 -0
  17. {flexmetric-0.5.1 → flexmetric-0.5.3}/flexmetric/metric_process/expiring_queue.py +0 -0
  18. {flexmetric-0.5.1 → flexmetric-0.5.3}/flexmetric/metric_process/process_commands.py +0 -0
  19. {flexmetric-0.5.1 → flexmetric-0.5.3}/flexmetric/metric_process/prometheus_agent.py +0 -0
  20. {flexmetric-0.5.1 → flexmetric-0.5.3}/flexmetric/metric_process/views.py +0 -0
  21. {flexmetric-0.5.1 → flexmetric-0.5.3}/flexmetric.egg-info/SOURCES.txt +0 -0
  22. {flexmetric-0.5.1 → flexmetric-0.5.3}/flexmetric.egg-info/dependency_links.txt +0 -0
  23. {flexmetric-0.5.1 → flexmetric-0.5.3}/flexmetric.egg-info/entry_points.txt +0 -0
  24. {flexmetric-0.5.1 → flexmetric-0.5.3}/flexmetric.egg-info/top_level.txt +0 -0
  25. {flexmetric-0.5.1 → flexmetric-0.5.3}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: flexmetric
3
- Version: 0.5.1
3
+ Version: 0.5.3
4
4
  Summary: A secure flexible Prometheus exporter for commands, databases, functions.
5
5
  Home-page: https://github.com/nikhillingadhal1999/flexmetric
6
6
  Author: Nikhil Lingadhal
@@ -21,6 +21,7 @@ Requires-Dist: wheel
21
21
  Requires-Dist: twine
22
22
  Requires-Dist: flask
23
23
  Requires-Dist: clickhouse-connect
24
+ Requires-Dist: psycopg2-binary
24
25
  Dynamic: author
25
26
  Dynamic: classifier
26
27
  Dynamic: description
@@ -32,25 +33,38 @@ Dynamic: requires-dist
32
33
  Dynamic: requires-python
33
34
  Dynamic: summary
34
35
 
35
- # FlexMetric
36
+ FlexMetric is a lightweight, pluggable, and extensible Prometheus exporter that helps you collect, expose, and visualize custom metrics with minimal setup and maximum flexibility.
36
37
 
37
- FlexMetric is a lightweight, flexible, and extensible Prometheus exporter that allows you to securely expose system metrics, database query results, Python function outputs, and externally submitted metrics—via an optional Flask API with HTTPS support—as Prometheus-compatible metrics, all with minimal setup and maximum customization.
38
+ With FlexMetric, you can:
38
39
 
39
- ---
40
+ Run system commands and expose their output as metrics
41
+
42
+ Execute SQL queries against databases like SQLite, PostgreSQL, and ClickHouse
43
+
44
+ Call custom Python functions and export their results
40
45
 
41
- ## Features
46
+ Receive externally submitted metrics via a secure Flask-based API with optional HTTPS (TLS)
42
47
 
43
- - Run shell commands and expose the results as Prometheus metrics.
44
- ➔ **Harmful commands (e.g., file deletion, system shutdown) are blocked for safety.**
45
- - Execute SQL queries (e.g., SQLite) and monitor database statistics.
46
- ➔ **Potentially dangerous queries (e.g., `DROP`, `DELETE`, `TRUNCATE`) are not allowed.**
47
- - Automatically discover and expose Python function outputs as metrics.
48
- - Expose an optional **Flask API** (`/update_metric`) to receive external metrics dynamically.
49
- - Modular and easy to extend—add your own custom integrations.
50
- - Built-in Prometheus HTTP server (`/metrics`) with configurable port.
51
- - **Supports HTTPS** to securely expose both metrics and API endpoints.
52
- - **Input sanitization** is performed to ensure only safe commands and queries are executed.
48
+ All metrics are exposed in Prometheus-compatible format, making them ready for visualization in Grafana or any Prometheus-based monitoring stack.
49
+ ---
53
50
 
51
+ Paste your rich text content here. You can paste directly from Word or other rich text sources.
52
+
53
+ * Run **shell commands** and expose the results as **Prometheus metrics**.
54
+ ➔ _Harmful commands (e.g., file deletion, system shutdown) are blocked for safety._
55
+
56
+ * Execute **SQL queries** and monitor database statistics:
57
+
58
+ * **SQLite** (lightweight, file-based databases)
59
+ * **PostgreSQL** (robust, production-grade relational databases)
60
+ * **ClickHouse** (high-performance, analytical databases)
61
+ * Potentially dangerous queries (e.g., `DROP`, `DELETE`, `TRUNCATE`) are blocked by default.
62
+ * Automatically discover and expose **Python function outputs** as metrics.
63
+ * Expose an optional **Flask API** (`/update_metric`) to receive and update external metrics **dynamically**.
64
+ * Modular and **easy to extend**—add your own **custom integrations** with minimal effort.
65
+ * Built-in **Prometheus-compatible HTTP server** (`/metrics`) with configurable port.
66
+ * Supports **HTTPS** to securely expose both the metrics endpoint and API.
67
+ * Input **sanitization and validation** ensure only safe commands and queries are executed.
54
68
 
55
69
  ---
56
70
 
@@ -189,52 +203,99 @@ Filesystem Size Used Avail Use% Mounted on
189
203
  | `timeout_seconds` | Maximum time (in seconds) to wait for the command to complete. If it exceeds this time, the command is aborted. |
190
204
 
191
205
  ## Database mode
206
+ ## 🔗 Supported Database Connections
207
+
208
+ FlexMetric supports fetching and exposing metrics from multiple databases using a simple YAML-based configuration. This allows you to monitor data directly from your existing data sources without writing custom code.
209
+
210
+ ### ✅ Currently Supported Databases:
211
+
212
+ | Database | Type Name | Description |
213
+ |--------------|---------------|--------------------------------------------------|
214
+ | **SQLite** | `sqlite` | Lightweight, file-based relational database |
215
+ | **PostgreSQL** | `postgres` | Robust, production-grade relational database |
216
+ | **ClickHouse** | `clickhouse` | High-performance, analytical columnar database |
217
+
218
+ ---
219
+
220
+ ### 📄 Example `database.yaml` Configuration:
192
221
  file - database.yaml
193
222
  ```yaml
194
223
  databases:
195
- - id: "active_user_count"
224
+ - id: "local_sqlite"
225
+ type: "sqlite"
226
+ db_connection: "/path/to/example.db"
227
+
228
+ - id: "analytics_pg"
229
+ type: "postgres"
230
+ host: "localhost"
231
+ port: 5432
232
+ database: "metricsdb"
233
+ username: "postgres"
234
+ password: "postgres_password"
235
+ sslmode: "disable"
236
+ client_cert: "/path/to/cert.pem"
237
+ client_key: "/path/to/key.pem"
238
+ ca_cert: "/path/to/ca.pem"
239
+
240
+ - id: "clickhouse_cluster"
196
241
  type: "clickhouse"
197
242
  host: "localhost"
198
- port: 8123
243
+ port: 8443
199
244
  username: "default"
200
- password: ""
201
- client_cert: ""
202
- client_key: ""
203
- ca_cert: ""
204
-
205
- - id: "userdb"
206
- type: "sqlite"
207
- db_connection: "/path/to/my.db"
245
+ password: "clickhouse_password"
246
+ secure: true
247
+ client_cert: "/path/to/cert.pem"
248
+ client_key: "/path/to/key.pem"
249
+ ca_cert: "/path/to/ca.pem"
208
250
  ```
209
- file - queries.yaml
251
+
252
+ ## Supported Query Configuration
253
+
254
+ FlexMetric allows you to define custom queries in a simple YAML format. Each query is linked to a database using the `database_id` and can expose the results as Prometheus metrics with flexible labeling and value extraction.
255
+
256
+ ### Example `queries.yaml` Configuration:
257
+
210
258
  ```yaml
211
259
  commands:
212
- - id: "active_user_count"
213
- type: "clickhouse"
214
- database_id: "active_user_count"
260
+ - id: "active_user_count_pg"
261
+ type: "postgres"
262
+ database_id: "analytics_pg"
215
263
  query: |
216
264
  SELECT
217
265
  country AS country_name,
218
- COUNT() AS active_user_count
266
+ COUNT(*) AS active_user_count
219
267
  FROM users
220
- WHERE is_active = 1
221
- GROUP BY country
268
+ WHERE is_active = true
269
+ GROUP BY country;
222
270
  main_label: "active_user_count"
223
271
  labels: ["country_name"]
224
272
  value_column: "active_user_count"
225
273
 
226
- - id: "list_all_users_sqlite"
274
+ - id: "total_user_count_sqlite"
227
275
  type: "sqlite"
228
- database_id: "userdb"
276
+ database_id: "local_sqlite"
277
+ query: |
278
+ SELECT
279
+ 'all' AS user_group,
280
+ COUNT(*) AS total_user_count
281
+ FROM users;
282
+ main_label: "total_user_count"
283
+ labels: ["user_group"]
284
+ value_column: "total_user_count"
285
+
286
+ - id: "clickhouse_user_summary"
287
+ type: "clickhouse"
288
+ database_id: "clickhouse_cluster"
229
289
  query: |
230
290
  SELECT
231
- id,
232
- name
291
+ region AS region_name,
292
+ COUNT() AS user_count
233
293
  FROM users
234
- main_label: "user_list"
235
- labels: ["id", "name"]
236
- value_column: "id"
237
-
294
+ WHERE status = 'active'
295
+ GROUP BY region;
296
+ main_label: "clickhouse_user_count"
297
+ labels: ["region_name"]
298
+ value_column: "user_count"
238
299
  ```
239
300
  ## Functions mode
240
301
 
@@ -1,22 +1,35 @@
1
- # FlexMetric
1
+ FlexMetric is a lightweight, pluggable, and extensible Prometheus exporter that helps you collect, expose, and visualize custom metrics with minimal setup and maximum flexibility.
2
2
 
3
- FlexMetric is a lightweight, flexible, and extensible Prometheus exporter that allows you to securely expose system metrics, database query results, Python function outputs, and externally submitted metrics—via an optional Flask API with HTTPS support—as Prometheus-compatible metrics, all with minimal setup and maximum customization.
3
+ With FlexMetric, you can:
4
4
 
5
- ---
5
+ Run system commands and expose their output as metrics
6
+
7
+ Execute SQL queries against databases like SQLite, PostgreSQL, and ClickHouse
8
+
9
+ Call custom Python functions and export their results
6
10
 
7
- ## Features
11
+ Receive externally submitted metrics via a secure Flask-based API with optional HTTPS (TLS)
8
12
 
9
- - Run shell commands and expose the results as Prometheus metrics.
10
- ➔ **Harmful commands (e.g., file deletion, system shutdown) are blocked for safety.**
11
- - Execute SQL queries (e.g., SQLite) and monitor database statistics.
12
- ➔ **Potentially dangerous queries (e.g., `DROP`, `DELETE`, `TRUNCATE`) are not allowed.**
13
- - Automatically discover and expose Python function outputs as metrics.
14
- - Expose an optional **Flask API** (`/update_metric`) to receive external metrics dynamically.
15
- - Modular and easy to extend—add your own custom integrations.
16
- - Built-in Prometheus HTTP server (`/metrics`) with configurable port.
17
- - **Supports HTTPS** to securely expose both metrics and API endpoints.
18
- - **Input sanitization** is performed to ensure only safe commands and queries are executed.
13
+ All metrics are exposed in Prometheus-compatible format, making them ready for visualization in Grafana or any Prometheus-based monitoring stack.
14
+ ---
19
15
 
16
+ Paste your rich text content here. You can paste directly from Word or other rich text sources.
17
+
18
+ * Run **shell commands** and expose the results as **Prometheus metrics**.
19
+ ➔ _Harmful commands (e.g., file deletion, system shutdown) are blocked for safety._
20
+
21
+ * Execute **SQL queries** and monitor database statistics:
22
+
23
+ * **SQLite** (lightweight, file-based databases)
24
+ * **PostgreSQL** (robust, production-grade relational databases)
25
+ * **ClickHouse** (high-performance, analytical databases)
26
+ * Potentially dangerous queries (e.g., `DROP`, `DELETE`, `TRUNCATE`) are blocked by default.
27
+ * Automatically discover and expose **Python function outputs** as metrics.
28
+ * Expose an optional **Flask API** (`/update_metric`) to receive and update external metrics **dynamically**.
29
+ * Modular and **easy to extend**—add your own **custom integrations** with minimal effort.
30
+ * Built-in **Prometheus-compatible HTTP server** (`/metrics`) with configurable port.
31
+ * Supports **HTTPS** to securely expose both the metrics endpoint and API.
32
+ * Input **sanitization and validation** ensure only safe commands and queries are executed.
20
33
 
21
34
  ---
22
35
 
@@ -155,52 +168,99 @@ Filesystem Size Used Avail Use% Mounted on
155
168
  | `timeout_seconds` | Maximum time (in seconds) to wait for the command to complete. If it exceeds this time, the command is aborted. |
156
169
 
157
170
  ## Database mode
171
+ ## 🔗 Supported Database Connections
172
+
173
+ FlexMetric supports fetching and exposing metrics from multiple databases using a simple YAML-based configuration. This allows you to monitor data directly from your existing data sources without writing custom code.
174
+
175
+ ### ✅ Currently Supported Databases:
176
+
177
+ | Database | Type Name | Description |
178
+ |--------------|---------------|--------------------------------------------------|
179
+ | **SQLite** | `sqlite` | Lightweight, file-based relational database |
180
+ | **PostgreSQL** | `postgres` | Robust, production-grade relational database |
181
+ | **ClickHouse** | `clickhouse` | High-performance, analytical columnar database |
182
+
183
+ ---
184
+
185
+ ### 📄 Example `database.yaml` Configuration:
158
186
  file - database.yaml
159
187
  ```yaml
160
188
  databases:
161
- - id: "active_user_count"
189
+ - id: "local_sqlite"
190
+ type: "sqlite"
191
+ db_connection: "/path/to/example.db"
192
+
193
+ - id: "analytics_pg"
194
+ type: "postgres"
195
+ host: "localhost"
196
+ port: 5432
197
+ database: "metricsdb"
198
+ username: "postgres"
199
+ password: "postgres_password"
200
+ sslmode: "disable"
201
+ client_cert: "/path/to/cert.pem"
202
+ client_key: "/path/to/key.pem"
203
+ ca_cert: "/path/to/ca.pem"
204
+
205
+ - id: "clickhouse_cluster"
162
206
  type: "clickhouse"
163
207
  host: "localhost"
164
- port: 8123
208
+ port: 8443
165
209
  username: "default"
166
- password: ""
167
- client_cert: ""
168
- client_key: ""
169
- ca_cert: ""
170
-
171
- - id: "userdb"
172
- type: "sqlite"
173
- db_connection: "/path/to/my.db"
210
+ password: "clickhouse_password"
211
+ secure: true
212
+ client_cert: "/path/to/cert.pem"
213
+ client_key: "/path/to/key.pem"
214
+ ca_cert: "/path/to/ca.pem"
174
215
  ```
175
- file - queries.yaml
216
+
217
+ ## Supported Query Configuration
218
+
219
+ FlexMetric allows you to define custom queries in a simple YAML format. Each query is linked to a database using the `database_id` and can expose the results as Prometheus metrics with flexible labeling and value extraction.
220
+
221
+ ### Example `queries.yaml` Configuration:
222
+
176
223
  ```yaml
177
224
  commands:
178
- - id: "active_user_count"
179
- type: "clickhouse"
180
- database_id: "active_user_count"
225
+ - id: "active_user_count_pg"
226
+ type: "postgres"
227
+ database_id: "analytics_pg"
181
228
  query: |
182
229
  SELECT
183
230
  country AS country_name,
184
- COUNT() AS active_user_count
231
+ COUNT(*) AS active_user_count
185
232
  FROM users
186
- WHERE is_active = 1
187
- GROUP BY country
233
+ WHERE is_active = true
234
+ GROUP BY country;
188
235
  main_label: "active_user_count"
189
236
  labels: ["country_name"]
190
237
  value_column: "active_user_count"
191
238
 
192
- - id: "list_all_users_sqlite"
239
+ - id: "total_user_count_sqlite"
193
240
  type: "sqlite"
194
- database_id: "userdb"
241
+ database_id: "local_sqlite"
242
+ query: |
243
+ SELECT
244
+ 'all' AS user_group,
245
+ COUNT(*) AS total_user_count
246
+ FROM users;
247
+ main_label: "total_user_count"
248
+ labels: ["user_group"]
249
+ value_column: "total_user_count"
250
+
251
+ - id: "clickhouse_user_summary"
252
+ type: "clickhouse"
253
+ database_id: "clickhouse_cluster"
195
254
  query: |
196
255
  SELECT
197
- id,
198
- name
256
+ region AS region_name,
257
+ COUNT() AS user_count
199
258
  FROM users
200
- main_label: "user_list"
201
- labels: ["id", "name"]
202
- value_column: "id"
203
-
259
+ WHERE status = 'active'
260
+ GROUP BY region;
261
+ main_label: "clickhouse_user_count"
262
+ labels: ["region_name"]
263
+ value_column: "user_count"
204
264
  ```
205
265
  ## Functions mode
206
266
 
@@ -2,11 +2,55 @@ import clickhouse_connect
2
2
  import sqlite3
3
3
  from flexmetric.logging_module.logger import get_logger
4
4
  import os
5
+ import psycopg2
5
6
 
6
- logger = get_logger(__name__)
7
7
 
8
+ logger = get_logger(__name__)
8
9
  logger.info("database logs")
9
10
 
11
+ def create_postgres_client(db_conf: dict):
12
+ host = db_conf.get('host', 'localhost')
13
+ port = db_conf.get('port', 5432)
14
+ database = db_conf.get('database')
15
+ username = db_conf.get('username', 'postgres')
16
+ password = db_conf.get('password', '')
17
+
18
+ sslmode = db_conf.get('sslmode', 'prefer')
19
+ sslcert = db_conf.get('client_cert')
20
+ sslkey = db_conf.get('client_key')
21
+ sslrootcert = db_conf.get('ca_cert')
22
+
23
+ if not database:
24
+ raise ValueError("Missing 'database' name in PostgreSQL configuration")
25
+
26
+ conn_params = {
27
+ 'host': host,
28
+ 'port': port,
29
+ 'dbname': database,
30
+ 'user': username,
31
+ 'password': password,
32
+ 'sslmode': sslmode
33
+ }
34
+
35
+ if sslcert and sslkey and sslrootcert:
36
+ if not (os.path.isfile(sslcert) and os.path.isfile(sslkey) and os.path.isfile(sslrootcert)):
37
+ raise FileNotFoundError("One or more SSL certificate files not found.")
38
+ conn_params.update({
39
+ 'sslcert': sslcert,
40
+ 'sslkey': sslkey,
41
+ 'sslrootcert': sslrootcert,
42
+ 'sslmode': 'verify-full'
43
+ })
44
+
45
+ try:
46
+ conn = psycopg2.connect(**conn_params)
47
+ logger.info(f"PostgreSQL connection to '{database}' established successfully (SSL: {'Yes' if 'sslcert' in conn_params else 'No'})")
48
+ return conn
49
+
50
+ except Exception as e:
51
+ logger.error(f"Failed to create PostgreSQL client: {e}")
52
+ raise
53
+
10
54
  def create_clickhouse_client(db_conf):
11
55
  id = db_conf.get('id')
12
56
  host = db_conf.get('host', 'localhost')
@@ -1,7 +1,7 @@
1
1
  import yaml
2
2
  import re
3
- from flexmetric.metric_process.database_connections import create_clickhouse_client,create_sqlite_client
4
- from flexmetric.metric_process.queries_execution import execute_clickhouse_command,execute_sqlite_query
3
+ from flexmetric.metric_process.database_connections import create_clickhouse_client,create_sqlite_client,create_postgres_client
4
+ from flexmetric.metric_process.queries_execution import execute_clickhouse_command,execute_sqlite_query,execute_postgres_query
5
5
  from flexmetric.logging_module.logger import get_logger
6
6
  logger = get_logger(__name__)
7
7
 
@@ -59,7 +59,10 @@ def create_clients_from_config(config_file: str):
59
59
  client = create_sqlite_client(db_conf)
60
60
  clients[db_id] = client
61
61
  logger.info(clients)
62
-
62
+ elif db_type == 'postgres':
63
+ client = create_postgres_client(db_conf)
64
+ clients[db_id] = client
65
+ logger.info(clients)
63
66
  else:
64
67
  logger.info(f"Unsupported database type: {db_type}")
65
68
 
@@ -123,10 +126,13 @@ def execute_commands(clients: dict, commands_file: str):
123
126
  response ,column_names = execute_sqlite_query(client,query)
124
127
  result = process_and_get_value(cmd,response,column_names)
125
128
  results.append(result)
129
+ elif db_type == 'postgres':
130
+ response ,column_names = execute_postgres_query(client,query)
131
+ result = process_and_get_value(cmd,response,column_names)
132
+ results.append(result)
126
133
  else:
127
134
  logger.info(f"Unknown type '{db_type}' in command '{cmd_id}'")
128
135
  continue
129
-
130
136
  except Exception as e:
131
137
  logger.error(f"Command '{cmd_id}' failed: {e}")
132
138
  return results
@@ -21,4 +21,20 @@ def execute_sqlite_query(conn, query):
21
21
  return rows, column_names
22
22
  except Exception as ex:
23
23
  logger.error(f"Exception during SQLite query: {ex}")
24
+ return [], []
25
+
26
+ def execute_postgres_query(conn, query):
27
+ try:
28
+ cursor = conn.cursor()
29
+ cursor.execute(query)
30
+
31
+ rows = cursor.fetchall()
32
+ column_names = [desc[0] for desc in cursor.description]
33
+
34
+ logger.info(f"Query executed successfully. Rows fetched: {len(rows)}")
35
+
36
+ return rows, column_names
37
+
38
+ except Exception as ex:
39
+ logger.error(f"Exception during Postgres query: {ex}")
24
40
  return [], []
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: flexmetric
3
- Version: 0.5.1
3
+ Version: 0.5.3
4
4
  Summary: A secure flexible Prometheus exporter for commands, databases, functions.
5
5
  Home-page: https://github.com/nikhillingadhal1999/flexmetric
6
6
  Author: Nikhil Lingadhal
@@ -21,6 +21,7 @@ Requires-Dist: wheel
21
21
  Requires-Dist: twine
22
22
  Requires-Dist: flask
23
23
  Requires-Dist: clickhouse-connect
24
+ Requires-Dist: psycopg2-binary
24
25
  Dynamic: author
25
26
  Dynamic: classifier
26
27
  Dynamic: description
@@ -32,25 +33,38 @@ Dynamic: requires-dist
32
33
  Dynamic: requires-python
33
34
  Dynamic: summary
34
35
 
35
- # FlexMetric
36
+ FlexMetric is a lightweight, pluggable, and extensible Prometheus exporter that helps you collect, expose, and visualize custom metrics with minimal setup and maximum flexibility.
36
37
 
37
- FlexMetric is a lightweight, flexible, and extensible Prometheus exporter that allows you to securely expose system metrics, database query results, Python function outputs, and externally submitted metrics—via an optional Flask API with HTTPS support—as Prometheus-compatible metrics, all with minimal setup and maximum customization.
38
+ With FlexMetric, you can:
38
39
 
39
- ---
40
+ Run system commands and expose their output as metrics
41
+
42
+ Execute SQL queries against databases like SQLite, PostgreSQL, and ClickHouse
43
+
44
+ Call custom Python functions and export their results
40
45
 
41
- ## Features
46
+ Receive externally submitted metrics via a secure Flask-based API with optional HTTPS (TLS)
42
47
 
43
- - Run shell commands and expose the results as Prometheus metrics.
44
- ➔ **Harmful commands (e.g., file deletion, system shutdown) are blocked for safety.**
45
- - Execute SQL queries (e.g., SQLite) and monitor database statistics.
46
- ➔ **Potentially dangerous queries (e.g., `DROP`, `DELETE`, `TRUNCATE`) are not allowed.**
47
- - Automatically discover and expose Python function outputs as metrics.
48
- - Expose an optional **Flask API** (`/update_metric`) to receive external metrics dynamically.
49
- - Modular and easy to extend—add your own custom integrations.
50
- - Built-in Prometheus HTTP server (`/metrics`) with configurable port.
51
- - **Supports HTTPS** to securely expose both metrics and API endpoints.
52
- - **Input sanitization** is performed to ensure only safe commands and queries are executed.
48
+ All metrics are exposed in Prometheus-compatible format, making them ready for visualization in Grafana or any Prometheus-based monitoring stack.
49
+ ---
53
50
 
51
+ Paste your rich text content here. You can paste directly from Word or other rich text sources.
52
+
53
+ * Run **shell commands** and expose the results as **Prometheus metrics**.
54
+ ➔ _Harmful commands (e.g., file deletion, system shutdown) are blocked for safety._
55
+
56
+ * Execute **SQL queries** and monitor database statistics:
57
+
58
+ * **SQLite** (lightweight, file-based databases)
59
+ * **PostgreSQL** (robust, production-grade relational databases)
60
+ * **ClickHouse** (high-performance, analytical databases)
61
+ * Potentially dangerous queries (e.g., `DROP`, `DELETE`, `TRUNCATE`) are blocked by default.
62
+ * Automatically discover and expose **Python function outputs** as metrics.
63
+ * Expose an optional **Flask API** (`/update_metric`) to receive and update external metrics **dynamically**.
64
+ * Modular and **easy to extend**—add your own **custom integrations** with minimal effort.
65
+ * Built-in **Prometheus-compatible HTTP server** (`/metrics`) with configurable port.
66
+ * Supports **HTTPS** to securely expose both the metrics endpoint and API.
67
+ * Input **sanitization and validation** ensure only safe commands and queries are executed.
54
68
 
55
69
  ---
56
70
 
@@ -189,52 +203,99 @@ Filesystem Size Used Avail Use% Mounted on
189
203
  | `timeout_seconds` | Maximum time (in seconds) to wait for the command to complete. If it exceeds this time, the command is aborted. |
190
204
 
191
205
  ## Database mode
206
+ ## 🔗 Supported Database Connections
207
+
208
+ FlexMetric supports fetching and exposing metrics from multiple databases using a simple YAML-based configuration. This allows you to monitor data directly from your existing data sources without writing custom code.
209
+
210
+ ### ✅ Currently Supported Databases:
211
+
212
+ | Database | Type Name | Description |
213
+ |--------------|---------------|--------------------------------------------------|
214
+ | **SQLite** | `sqlite` | Lightweight, file-based relational database |
215
+ | **PostgreSQL** | `postgres` | Robust, production-grade relational database |
216
+ | **ClickHouse** | `clickhouse` | High-performance, analytical columnar database |
217
+
218
+ ---
219
+
220
+ ### 📄 Example `database.yaml` Configuration:
192
221
  file - database.yaml
193
222
  ```yaml
194
223
  databases:
195
- - id: "active_user_count"
224
+ - id: "local_sqlite"
225
+ type: "sqlite"
226
+ db_connection: "/path/to/example.db"
227
+
228
+ - id: "analytics_pg"
229
+ type: "postgres"
230
+ host: "localhost"
231
+ port: 5432
232
+ database: "metricsdb"
233
+ username: "postgres"
234
+ password: "postgres_password"
235
+ sslmode: "disable"
236
+ client_cert: "/path/to/cert.pem"
237
+ client_key: "/path/to/key.pem"
238
+ ca_cert: "/path/to/ca.pem"
239
+
240
+ - id: "clickhouse_cluster"
196
241
  type: "clickhouse"
197
242
  host: "localhost"
198
- port: 8123
243
+ port: 8443
199
244
  username: "default"
200
- password: ""
201
- client_cert: ""
202
- client_key: ""
203
- ca_cert: ""
204
-
205
- - id: "userdb"
206
- type: "sqlite"
207
- db_connection: "/path/to/my.db"
245
+ password: "clickhouse_password"
246
+ secure: true
247
+ client_cert: "/path/to/cert.pem"
248
+ client_key: "/path/to/key.pem"
249
+ ca_cert: "/path/to/ca.pem"
208
250
  ```
209
- file - queries.yaml
251
+
252
+ ## Supported Query Configuration
253
+
254
+ FlexMetric allows you to define custom queries in a simple YAML format. Each query is linked to a database using the `database_id` and can expose the results as Prometheus metrics with flexible labeling and value extraction.
255
+
256
+ ### Example `queries.yaml` Configuration:
257
+
210
258
  ```yaml
211
259
  commands:
212
- - id: "active_user_count"
213
- type: "clickhouse"
214
- database_id: "active_user_count"
260
+ - id: "active_user_count_pg"
261
+ type: "postgres"
262
+ database_id: "analytics_pg"
215
263
  query: |
216
264
  SELECT
217
265
  country AS country_name,
218
- COUNT() AS active_user_count
266
+ COUNT(*) AS active_user_count
219
267
  FROM users
220
- WHERE is_active = 1
221
- GROUP BY country
268
+ WHERE is_active = true
269
+ GROUP BY country;
222
270
  main_label: "active_user_count"
223
271
  labels: ["country_name"]
224
272
  value_column: "active_user_count"
225
273
 
226
- - id: "list_all_users_sqlite"
274
+ - id: "total_user_count_sqlite"
227
275
  type: "sqlite"
228
- database_id: "userdb"
276
+ database_id: "local_sqlite"
277
+ query: |
278
+ SELECT
279
+ 'all' AS user_group,
280
+ COUNT(*) AS total_user_count
281
+ FROM users;
282
+ main_label: "total_user_count"
283
+ labels: ["user_group"]
284
+ value_column: "total_user_count"
285
+
286
+ - id: "clickhouse_user_summary"
287
+ type: "clickhouse"
288
+ database_id: "clickhouse_cluster"
229
289
  query: |
230
290
  SELECT
231
- id,
232
- name
291
+ region AS region_name,
292
+ COUNT() AS user_count
233
293
  FROM users
234
- main_label: "user_list"
235
- labels: ["id", "name"]
236
- value_column: "id"
237
-
294
+ WHERE status = 'active'
295
+ GROUP BY region;
296
+ main_label: "clickhouse_user_count"
297
+ labels: ["region_name"]
298
+ value_column: "user_count"
238
299
  ```
239
300
  ## Functions mode
240
301
 
@@ -6,3 +6,4 @@ wheel
6
6
  twine
7
7
  flask
8
8
  clickhouse-connect
9
+ psycopg2-binary
@@ -2,7 +2,7 @@ from setuptools import setup, find_packages
2
2
 
3
3
  setup(
4
4
  name="flexmetric",
5
- version="0.5.1",
5
+ version="0.5.3",
6
6
  author="Nikhil Lingadhal",
7
7
  description="A secure flexible Prometheus exporter for commands, databases, functions.",
8
8
  long_description=open("README.md").read(),
@@ -23,7 +23,8 @@ setup(
23
23
  "wheel",
24
24
  "twine",
25
25
  "flask",
26
- "clickhouse-connect"
26
+ "clickhouse-connect",
27
+ "psycopg2-binary"
27
28
  ],
28
29
  entry_points={
29
30
  "console_scripts": [
File without changes