Skip to content

Commit a2ba6f7

Browse files
committed
feat: track and forward events
1 parent d718ca9 commit a2ba6f7

File tree

4 files changed

+64
-2
lines changed

4 files changed

+64
-2
lines changed

.env.example

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
GETDX_API_KEY=your_api_key_here
2+
EVENTS_TRACKED=Workspace Deleted,Workspace Manual Build Failure,Workspace Automatic Build Failure,Workspace Automatically Updated,Workspace Dormant,Workspace Marked For Deletion,User Account Created,User Account Deleted,User Account Suspended,User Account Activated,Template Deleted

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
.env

main.py

Lines changed: 58 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,23 @@
11
import logging
2+
import os
3+
import requests
4+
from dotenv import load_dotenv
25
from flask import Flask, jsonify, request
36

7+
# Load environment variables from .env file
8+
load_dotenv()
9+
410
# Configure logging
511
logging.basicConfig(level=logging.INFO)
612
logger = logging.getLogger(__name__)
713

14+
# Environment variables for configuration
15+
GETDX_API_KEY = os.getenv("GETDX_API_KEY")
16+
EVENTS_TRACKED = os.getenv("EVENTS_TRACKED", "").split(",")
17+
18+
# Clean up event list and convert to lowercase for case-insensitive comparison
19+
EVENTS_TRACKED = [event.strip().lower() for event in EVENTS_TRACKED]
20+
821
app = Flask(__name__)
922

1023
@app.route("/", methods=['GET'])
@@ -15,11 +28,55 @@ def hello_world():
1528
def webhook_handler():
1629
payload = request.get_json()
1730
logger.info("Received webhook payload: %s", payload)
31+
32+
event_name = payload.get("event", "").strip()
33+
34+
if event_name.lower() in EVENTS_TRACKED:
35+
logger.info("Forwarding event: %s", event_name)
36+
forward_to_getdx(payload)
37+
else:
38+
logger.info("Event not tracked, ignoring: %s", event_name)
39+
1840
return jsonify({"status": "received"})
1941

42+
def forward_to_getdx(payload):
43+
if not GETDX_API_KEY:
44+
logger.error("GETDX_API_KEY is not set")
45+
return
46+
47+
# Extract user information more flexibly
48+
user_email = payload.get("user", {}).get("email") or payload.get("user_email")
49+
50+
getdx_payload = {
51+
"name": payload.get("event"),
52+
"email": user_email,
53+
"timestamp": payload.get("timestamp"),
54+
"properties": {
55+
"workspace_name": payload.get("workspace", {}).get("name"),
56+
"template_name": payload.get("template", {}).get("name"),
57+
"user_name": payload.get("user", {}).get("username"),
58+
"organization": payload.get("organization", {}).get("name")
59+
}
60+
}
61+
62+
# Remove None values from properties
63+
getdx_payload["properties"] = {k: v for k, v in getdx_payload["properties"].items() if v is not None}
64+
65+
headers = {
66+
"Content-Type": "application/json",
67+
"Authorization": f"Bearer {GETDX_API_KEY}"
68+
}
69+
70+
try:
71+
response = requests.post("https://api.getdx.com/events.track", json=getdx_payload, headers=headers)
72+
response.raise_for_status()
73+
logger.info("Successfully forwarded event to getDX")
74+
except requests.exceptions.RequestException as e:
75+
logger.error("Failed to forward event to getDX: %s", e)
76+
2077
@app.route("/health")
2178
def health_check():
2279
return jsonify({"status": "healthy"})
2380

2481
if __name__ == "__main__":
25-
app.run(host="0.0.0.0", port=8080, debug=True)
82+
app.run(host="0.0.0.0", port=8080, debug=True)

requirements.txt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,4 @@
11
flask==3.0.2
2-
gunicorn==21.2.0
2+
gunicorn==21.2.0
3+
python-dotenv==1.0.1
4+
requests==2.31.0

0 commit comments

Comments
 (0)