1+ #! /usr/bin/env bash
2+
3+ # Configuration
4+ P_URL=${P_URL:- " http://localhost:8000" }
5+ P_USERNAME=${P_USERNAME:- " admin" }
6+ P_PASSWORD=${P_PASSWORD:- " admin" }
7+ P_STREAM=${P_STREAM:- " demodata" }
8+
9+ # Pre-compute auth header
10+ AUTH_HEADER=" Authorization: Basic $( echo -n " $P_USERNAME :$P_PASSWORD " | base64) "
11+
12+ # Common curl function with retry logic
13+ curl_with_retry () {
14+ local url=" $1 "
15+ local method=" $2 "
16+ local data=" $3 "
17+ local content_type=" ${4:- application/ json} "
18+ local max_retries=" ${5:- 3} "
19+ local retry_count=0
20+ local data_file=" $7 "
21+
22+ # Create temp file if data is provided (either as string or file)
23+ if [[ -n " $data_file " ]]; then
24+ temp_file=" $data_file "
25+ elif [[ -n " $data " ]]; then
26+ temp_file=$( mktemp)
27+ if [[ $? -ne 0 ]]; then
28+ return 1
29+ fi
30+ printf " %s" " $data " > " $temp_file "
31+ fi
32+
33+ while [[ $retry_count -lt $max_retries ]]; do
34+ local max_time=$(( 10 + (retry_count * 10 )) )
35+ local connect_timeout=5
36+
37+ local curl_cmd=" curl -s -w \" \n%{http_code}\" --max-time $max_time --connect-timeout $connect_timeout "
38+
39+ # Add headers
40+ curl_cmd+=" -H \" Content-Type: $content_type \" "
41+ curl_cmd+=" -H \" $AUTH_HEADER \" "
42+
43+ # Add method and data
44+ if [[ " $method " == " POST" ]]; then
45+ curl_cmd+=" -X POST"
46+ if [[ -n " $temp_file " ]]; then
47+ curl_cmd+=" --data-binary \" @$temp_file \" "
48+ elif [[ -n " $data " ]]; then
49+ curl_cmd+=" -d \" $data \" "
50+ fi
51+ fi
52+
53+ # Add URL
54+ curl_cmd+=" \" $url \" "
55+
56+ # Execute curl
57+ local response
58+ response=$( eval " $curl_cmd " 2>&1 )
59+ local curl_exit_code=$?
60+
61+ # Check curl exit code
62+ if [[ $curl_exit_code -eq 0 ]]; then
63+ local status_code
64+ if [[ -n " $response " ]]; then
65+ status_code=$( echo " $response " | tail -n1)
66+ local response_body=$( echo " $response " | sed ' $d' )
67+
68+ # Clean up temp file (only if we created it)
69+ if [[ -n " $temp_file " && -z " $data_file " ]]; then
70+ rm -f " $temp_file "
71+ fi
72+
73+ if [[ " $status_code " == " 200" || " $status_code " == " 201" ]]; then
74+ echo " $response_body "
75+ return 0
76+ else
77+ return 1
78+ fi
79+ else
80+ return 1
81+ fi
82+ elif [[ $curl_exit_code -eq 28 ]]; then
83+ # Timeout - retry
84+ retry_count=$(( retry_count + 1 ))
85+ sleep 1
86+ else
87+ break
88+ fi
89+ done
90+
91+ # Clean up temp file on failure (only if we created it)
92+ if [[ -n " $temp_file " && -z " $data_file " ]]; then
93+ rm -f " $temp_file "
94+ fi
95+
96+ return 1
97+ }
98+
99+ # Create webhook target
100+ create_target () {
101+ response=$( curl -s -H " Content-Type: application/json" -H " $AUTH_HEADER " -X POST " $P_URL /api/v1/targets" -d @- << EOF
102+ {"type":"webhook","endpoint":"https://webhook.site/8e1f26bd-2f5b-47a2-9d0b-3b3dabb30710","name":"Test Webhook","auth":{"username":"","password":""},"skipTlsCheck":false,"notificationConfig":{"interval":1,"times":1}}
103+ EOF
104+ )
105+
106+ curl_exit_code=$?
107+
108+ if [[ $curl_exit_code -eq 0 && -n " $response " ]]; then
109+ # Extract target ID from response
110+ target_id=$( echo " $response " | grep -o ' "id":"[^"]*"' | cut -d' "' -f4)
111+ if [[ -n " $target_id " ]]; then
112+ echo " Target created successfully with ID: $target_id " >&2
113+ echo " $target_id "
114+ return 0
115+ else
116+ echo " Failed to extract target ID from response" >&2
117+ echo " Response: $response " >&2
118+ return 1
119+ fi
120+ else
121+ echo " Failed to create target" >&2
122+ echo " Curl exit code: $curl_exit_code " >&2
123+ echo " Response: $response " >&2
124+ return 1
125+ fi
126+ }
127+
128+ # Create JSON file to avoid control character issues
129+ create_json_file () {
130+ local filename=" $1 "
131+ local content=" $2 "
132+
133+ # Create temporary file with proper JSON content
134+ temp_json=$( mktemp)
135+ printf " %s" " $content " > " $temp_json "
136+ echo " $temp_json "
137+ }
138+
139+ # Create alerts
140+ create_alerts () {
141+ local target_id=" $1 "
142+
143+ if [[ -z " $target_id " ]]; then
144+ echo " Target ID is required to create alerts"
145+ return 1
146+ fi
147+
148+ # Alert 1: Error Count (severity_number = 18)
149+ alert1_template=' {"severity":"high","title":"error count","stream":"STREAM_PLACEHOLDER","alertType":"threshold","aggregates":{"aggregateConfig":[{"aggregateFunction":"count","conditions":{"operator":null,"conditionConfig":[{"column":"severity_number","operator":"=","value":"18"}]},"column":"severity_number","operator":">","value":1000}]},"evalConfig":{"rollingWindow":{"evalStart":"5h","evalEnd":"now","evalFrequency":1}},"targets":["TARGET_PLACEHOLDER"]}'
150+
151+ alert1_json=$( echo " $alert1_template " | sed " s|STREAM_PLACEHOLDER|$P_STREAM |g" | sed " s|TARGET_PLACEHOLDER|$target_id |g" )
152+ response1=$( curl -s -H " Content-Type: application/json" -H " $AUTH_HEADER " -X POST -d " $alert1_json " " $P_URL /api/v1/alerts" )
153+ if [[ $? -eq 0 && -n " $response1 " ]]; then
154+ echo " Alert 1 created successfully"
155+ else
156+ echo " Failed to create Alert 1"
157+ echo " Response: $response1 "
158+ fi
159+
160+ # Alert 2: 400 Errors
161+
162+ alert2_template=' {"severity":"critical","title":"400 Errors","stream":"STREAM_PLACEHOLDER","alertType":"threshold","aggregates":{"aggregateConfig":[{"aggregateFunction":"count","conditions":{"operator":null,"conditionConfig":[{"column":"body","operator":"contains","value":"400"}]},"column":"body","operator":">","value":10}]},"evalConfig":{"rollingWindow":{"evalStart":"5h","evalEnd":"now","evalFrequency":1}},"targets":["TARGET_PLACEHOLDER"]}'
163+
164+ alert2_json=$( echo " $alert2_template " | sed " s|STREAM_PLACEHOLDER|$P_STREAM |g" | sed " s|TARGET_PLACEHOLDER|$target_id |g" )
165+
166+ response2=$( curl -s -H " Content-Type: application/json" -H " $AUTH_HEADER " -X POST -d " $alert2_json " " $P_URL /api/v1/alerts" )
167+ if [[ $? -eq 0 && -n " $response2 " ]]; then
168+ echo " Alert 2 created successfully"
169+ else
170+ echo " Failed to create Alert 2"
171+ echo " Response: $response2 "
172+ fi
173+
174+ # Alert 3: Trace ID or Span ID null
175+
176+ alert3_template=' {"severity":"high","title":"Trace ID or Span ID null","stream":"STREAM_PLACEHOLDER","alertType":"threshold","aggregates":{"aggregateConfig":[{"aggregateFunction":"count","conditions":{"operator":null,"conditionConfig":[{"column":"trace_id","operator":"is null","value":""}]},"column":"trace_id","operator":">","value":0}]},"evalConfig":{"rollingWindow":{"evalStart":"5h","evalEnd":"now","evalFrequency":1}},"targets":["TARGET_PLACEHOLDER"]}'
177+
178+ alert3_json=$( echo " $alert3_template " | sed " s|STREAM_PLACEHOLDER|$P_STREAM |g" | sed " s|TARGET_PLACEHOLDER|$target_id |g" )
179+
180+ response3=$( curl -s -H " Content-Type: application/json" -H " $AUTH_HEADER " -X POST -d " $alert3_json " " $P_URL /api/v1/alerts" )
181+ if [[ $? -eq 0 && -n " $response3 " ]]; then
182+ echo " Alert 3 created successfully"
183+ else
184+ echo " Failed to create Alert 3"
185+ echo " Response: $response3 "
186+ fi
187+
188+ sleep 1
189+ }
190+
191+ # Main execution
192+ # Create target and get ID
193+ target_id=$( create_target)
194+
195+ if [[ $? -eq 0 && -n " $target_id " ]]; then
196+ echo " Target creation successful, proceeding with alerts..."
197+ sleep 2
198+
199+ # Create alerts using the target ID
200+ create_alerts " $target_id "
201+ else
202+ echo " Failed to create target, cannot proceed with alerts"
203+ exit 1
204+ fi
205+
206+ exit 0
0 commit comments