Skip to content

Commit 9923856

Browse files
authored
Merge pull request #1 from flightphp/add-new-request-data-points
Added IP, User Agent, Host, and Session ID to requests
2 parents e0c9757 + f80643c commit 9923856

File tree

6 files changed

+114
-8
lines changed

6 files changed

+114
-8
lines changed

dashboard/js/script.js

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -401,6 +401,7 @@ function populateRequestLog(requests) {
401401
<td class="${urlCellClass}" data-full-url="${r.request_url}">${r.request_url}</td>
402402
<td>${time.toFixed(3)} ms</td>
403403
<td>${r.response_code}</td>
404+
<td>${r.ip}</td>
404405
<td>${botStatus}</td>
405406
<td>
406407
<button class="btn btn-outline-primary btn-sm" type="button" data-bs-toggle="collapse"
@@ -701,6 +702,12 @@ function setupFilterHandlers() {
701702
const customEvent = document.getElementById('filter-custom-event').value.trim();
702703
const minTime = document.getElementById('filter-min-time').value.trim();
703704

705+
// New metadata filters
706+
const ip = document.getElementById('filter-ip').value.trim();
707+
const host = document.getElementById('filter-host').value.trim();
708+
const sessionId = document.getElementById('filter-session-id').value.trim();
709+
const userAgent = document.getElementById('filter-user-agent').value.trim();
710+
704711
// Clear previous filters
705712
activeFilters = {};
706713

@@ -718,6 +725,12 @@ function setupFilterHandlers() {
718725
if (customEvent) activeFilters.custom_event_type = customEvent;
719726
if (minTime) activeFilters.min_time = minTime;
720727

728+
// Add new metadata filters
729+
if (ip) activeFilters.ip = ip;
730+
if (host) activeFilters.host = host;
731+
if (sessionId) activeFilters.session_id = sessionId;
732+
if (userAgent) activeFilters.user_agent = userAgent;
733+
721734
// Update UI to show active filters
722735
updateActiveFiltersDisplay();
723736

@@ -739,6 +752,12 @@ function setupFilterHandlers() {
739752
document.getElementById('filter-custom-event').value = '';
740753
document.getElementById('filter-min-time').value = '';
741754

755+
// Reset new metadata filters
756+
document.getElementById('filter-ip').value = '';
757+
document.getElementById('filter-host').value = '';
758+
document.getElementById('filter-session-id').value = '';
759+
document.getElementById('filter-user-agent').value = '';
760+
742761
// Hide the exact code input
743762
exactCodeContainer.style.display = 'none';
744763

@@ -791,6 +810,19 @@ function setupFilterHandlers() {
791810
case 'min_time':
792811
filterLabel = `Min Time: ${value}ms`;
793812
break;
813+
// Add new metadata filter labels
814+
case 'ip':
815+
filterLabel = `IP: ${value}`;
816+
break;
817+
case 'host':
818+
filterLabel = `Host: ${value}`;
819+
break;
820+
case 'session_id':
821+
filterLabel = `Session: ${value}`;
822+
break;
823+
case 'user_agent':
824+
filterLabel = `User Agent: ${value}`;
825+
break;
794826
default:
795827
filterLabel = `${key}: ${value}`;
796828
}

dashboard/views/dashboard.php

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,23 @@
166166
<label for="filter-min-time" class="form-label">Min Time (ms)</label>
167167
<input type="number" class="form-control" id="filter-min-time" placeholder="e.g. 100">
168168
</div>
169+
<!-- New metadata filters -->
170+
<div class="col-md-3">
171+
<label for="filter-ip" class="form-label">IP Address</label>
172+
<input type="text" class="form-control" id="filter-ip" placeholder="e.g. 192.168.0.1">
173+
</div>
174+
<div class="col-md-3">
175+
<label for="filter-host" class="form-label">Host</label>
176+
<input type="text" class="form-control" id="filter-host" placeholder="e.g. example.com">
177+
</div>
178+
<div class="col-md-3">
179+
<label for="filter-session-id" class="form-label">Session ID</label>
180+
<input type="text" class="form-control" id="filter-session-id" placeholder="Filter by session...">
181+
</div>
182+
<div class="col-md-3">
183+
<label for="filter-user-agent" class="form-label">User Agent</label>
184+
<input type="text" class="form-control" id="filter-user-agent" placeholder="Contains...">
185+
</div>
169186
<div class="col-12 text-end">
170187
<button type="button" class="btn btn-primary" id="apply-filters">Apply Filters</button>
171188
<button type="button" class="btn btn-outline-secondary" id="clear-filters">Clear Filters</button>
@@ -188,6 +205,7 @@
188205
<th>Request URL</th>
189206
<th>Total Time (ms)</th>
190207
<th>Response Code</th>
208+
<th>IP</th>
191209
<th>Bot</th>
192210
<th>Details</th>
193211
</tr>
@@ -301,6 +319,6 @@
301319
<!-- Chart.js -->
302320
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
303321
<!-- Dashboard Logic -->
304-
<script src="/js/script.js?ver=1"></script>
322+
<script src="/js/script.js?ver=2"></script>
305323
</body>
306324
</html>

src/Apm.php

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,9 +105,17 @@ public function bindEventsToFlightInstance(Engine $app): void
105105
$this->metrics['start_memory'] = memory_get_usage();
106106
$this->metrics['request_method'] = $request->method;
107107
$this->metrics['request_url'] = $request->url;
108+
$this->metrics['ip'] = $request->proxy_ip ?: $request->ip;
109+
$this->metrics['user_agent'] = $request->user_agent ?? '';
110+
$this->metrics['host'] = $request->host ?? '';
111+
if(function_exists('session_id')) {
112+
$this->metrics['session_id'] = session_status() === PHP_SESSION_ACTIVE ? session_id() : null;
113+
} else {
114+
$this->metrics['session_id'] = null;
115+
}
108116

109117
// Check if the request is from a bot
110-
$userAgent = $request->headers['User-Agent'] ?? '';
118+
$userAgent = $request->user_agent ?? '';
111119
$this->metrics['is_bot'] = $this->isBot($userAgent);
112120
});
113121

@@ -176,6 +184,7 @@ public function bindEventsToFlightInstance(Engine $app): void
176184
// are logged, while a value of 0.1 means only 10% of requests are logged.
177185
if (rand(0, 9999) / 10000 <= $this->sampleRate) {
178186
foreach($this->pdoConnections as $pdo) {
187+
/** @var PdoWrapper $pdo */
179188
if(method_exists($pdo, 'logQueries')) {
180189
$pdo->logQueries();
181190
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
-- Add request metadata columns to apm_requests
2+
ALTER TABLE apm_requests ADD COLUMN ip TEXT;
3+
ALTER TABLE apm_requests ADD COLUMN user_agent TEXT;
4+
ALTER TABLE apm_requests ADD COLUMN host TEXT;
5+
ALTER TABLE apm_requests ADD COLUMN session_id TEXT;
6+
7+
-- Create indexes for the new columns
8+
CREATE INDEX IF NOT EXISTS idx_apm_requests_ip ON apm_requests(ip);
9+
CREATE INDEX IF NOT EXISTS idx_apm_requests_host ON apm_requests(host);
10+
CREATE INDEX IF NOT EXISTS idx_apm_requests_session_id ON apm_requests(session_id);
11+
-- Index on user_agent can help with bot filtering
12+
CREATE INDEX IF NOT EXISTS idx_apm_requests_user_agent ON apm_requests(user_agent);

src/apm/presenter/SqlitePresenter.php

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,12 @@ public function getRequestsData(string $threshold, int $page, int $perPage, stri
184184
$minTime = $_GET['min_time'] ?? '';
185185
$requestId = $_GET['request_id'] ?? '';
186186

187+
// New metadata filters
188+
$ip = $_GET['ip'] ?? '';
189+
$host = $_GET['host'] ?? '';
190+
$sessionId = $_GET['session_id'] ?? '';
191+
$userAgent = $_GET['user_agent'] ?? '';
192+
187193
// Build main query with conditions for URL and response code
188194
$conditions = ['timestamp >= ?'];
189195
$params = [$threshold];
@@ -222,6 +228,27 @@ public function getRequestsData(string $threshold, int $page, int $perPage, stri
222228
$conditions[] = 'total_time >= ?';
223229
$params[] = $minTimeSeconds;
224230
}
231+
232+
// Add new metadata filters
233+
if (!empty($ip)) {
234+
$conditions[] = 'ip = ?';
235+
$params[] = "$ip";
236+
}
237+
238+
if (!empty($host)) {
239+
$conditions[] = 'host = ?';
240+
$params[] = "$host";
241+
}
242+
243+
if (!empty($sessionId)) {
244+
$conditions[] = 'session_id = ?';
245+
$params[] = "$sessionId";
246+
}
247+
248+
if (!empty($userAgent)) {
249+
$conditions[] = 'user_agent LIKE ?';
250+
$params[] = "%$userAgent%";
251+
}
225252

226253
// Build the base query with all conditions
227254
$whereClause = implode(' AND ', $conditions);
@@ -292,7 +319,7 @@ public function getRequestsData(string $threshold, int $page, int $perPage, stri
292319
$placeholders = implode(',', array_fill(0, count($paginatedRequestIds), '?'));
293320

294321
// Get the actual request data
295-
$requestQuery = "SELECT request_id, timestamp, request_url, total_time, response_code, is_bot FROM apm_requests
322+
$requestQuery = "SELECT request_id, timestamp, request_url, total_time, response_code, is_bot, ip, user_agent, host, session_id FROM apm_requests
296323
WHERE request_id IN ($placeholders) ORDER BY timestamp DESC";
297324
$stmt = $this->db->prepare($requestQuery);
298325
$stmt->execute($paginatedRequestIds);

src/apm/writer/SqliteWriter.php

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -123,23 +123,31 @@ protected function storeMainMetrics(array $metrics): string
123123
response_code,
124124
response_size,
125125
response_build_time,
126-
is_bot
127-
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
126+
is_bot,
127+
ip,
128+
user_agent,
129+
host,
130+
session_id
131+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
128132
');
129133

130-
$isBot = (int) $metrics['is_bot'];
134+
$isBot = (int) $metrics['is_bot'];
131135

132136
$stmt->execute([
133137
$requestId,
134-
gmdate('Y-m-d H:i:s', (int) $metrics['start_time']),
138+
gmdate('Y-m-d H:i:s', (int) $metrics['start_time']),
135139
$metrics['request_method'] ?? null,
136140
$metrics['request_url'] ?? null,
137141
$metrics['total_time'] ?? null,
138142
$metrics['peak_memory'] ?? null,
139143
$metrics['response_code'] ?? null,
140144
$metrics['response_size'] ?? null,
141145
$metrics['response_build_time'] ?? null,
142-
$isBot
146+
$isBot,
147+
$metrics['ip'] ?? null,
148+
$metrics['user_agent'] ?? null,
149+
$metrics['host'] ?? null,
150+
$metrics['session_id'] ?? null
143151
]);
144152

145153
return $requestId;

0 commit comments

Comments
 (0)