Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -26,26 +26,26 @@ DROP EVENT SESSION [{sessionName}] ON DATABASE
END

CREATE EVENT SESSION [{sessionName}] ON DATABASE
ADD EVENT sqlserver.attention(
ACTION(package0.event_sequence,sqlserver.client_app_name,sqlserver.client_pid,sqlserver.database_id,sqlserver.username,sqlserver.query_hash,sqlserver.session_id)
WHERE ([package0].[equal_boolean]([sqlserver].[is_system],(0)))),
ADD EVENT sqlserver.existing_connection(SET collect_options_text=(1)
ACTION(package0.event_sequence,sqlserver.client_app_name,sqlserver.client_pid,sqlserver.username,sqlserver.session_id)),
ADD EVENT sqlserver.login(SET collect_options_text=(1)
ACTION(package0.event_sequence,sqlserver.client_app_name,sqlserver.client_pid,sqlserver.username,sqlserver.session_id)),
ADD EVENT sqlserver.logout(
ACTION(package0.event_sequence,sqlserver.client_app_name,sqlserver.client_pid,sqlserver.username,sqlserver.session_id)),
ADD EVENT sqlserver.rpc_completed(
ACTION(package0.event_sequence,sqlserver.client_app_name,sqlserver.client_pid,sqlserver.database_id,sqlserver.database_name,sqlserver.username,sqlserver.query_hash,sqlserver.session_id)
WHERE ([package0].[equal_boolean]([sqlserver].[is_system],(0)))),
ADD EVENT sqlserver.sql_batch_completed(
ACTION(package0.event_sequence,sqlserver.client_app_name,sqlserver.client_pid,sqlserver.database_id,sqlserver.database_name,sqlserver.username,sqlserver.query_hash,sqlserver.session_id)
WHERE ([package0].[equal_boolean]([sqlserver].[is_system],(0)))),
ADD EVENT sqlserver.sql_batch_starting(
ACTION(package0.event_sequence,sqlserver.client_app_name,sqlserver.client_pid,sqlserver.database_id,sqlserver.database_name,sqlserver.username,sqlserver.query_hash,sqlserver.session_id)
WHERE ([package0].[equal_boolean]([sqlserver].[is_system],(0))))
ADD TARGET package0.ring_buffer(SET max_events_limit=(1001))
WITH (EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,MAX_DISPATCH_LATENCY=5 SECONDS,MAX_EVENT_SIZE=0 KB,MEMORY_PARTITION_MODE=PER_CPU,TRACK_CAUSALITY=ON,STARTUP_STATE=OFF)";
ADD EVENT sqlserver.attention(
ACTION(package0.event_sequence,sqlserver.client_app_name,sqlserver.client_hostname,sqlserver.client_pid,sqlserver.database_id,sqlserver.username,sqlserver.query_hash,sqlserver.session_id)
WHERE ([package0].[equal_boolean]([sqlserver].[is_system],(0)))),
ADD EVENT sqlserver.existing_connection(SET collect_options_text=(1)
ACTION(package0.event_sequence,sqlserver.client_app_name,sqlserver.client_hostname,sqlserver.client_pid,sqlserver.username,sqlserver.session_id)),
ADD EVENT sqlserver.login(SET collect_options_text=(1)
ACTION(package0.event_sequence,sqlserver.client_app_name,sqlserver.client_hostname,sqlserver.client_pid,sqlserver.username,sqlserver.session_id)),
ADD EVENT sqlserver.logout(
ACTION(package0.event_sequence,sqlserver.client_app_name,sqlserver.client_hostname,sqlserver.client_pid,sqlserver.username,sqlserver.session_id)),
ADD EVENT sqlserver.rpc_completed(
ACTION(package0.event_sequence,sqlserver.client_app_name,sqlserver.client_hostname,sqlserver.client_pid,sqlserver.database_id,sqlserver.database_name,sqlserver.username,sqlserver.query_hash,sqlserver.session_id)
WHERE ([package0].[equal_boolean]([sqlserver].[is_system],(0)))),
ADD EVENT sqlserver.sql_batch_completed(
ACTION(package0.event_sequence,sqlserver.client_app_name,sqlserver.client_hostname,sqlserver.client_pid,sqlserver.database_id,sqlserver.database_name,sqlserver.username,sqlserver.query_hash,sqlserver.session_id)
WHERE ([package0].[equal_boolean]([sqlserver].[is_system],(0)))),
ADD EVENT sqlserver.sql_batch_starting(
ACTION(package0.event_sequence,sqlserver.client_app_name,sqlserver.client_hostname,sqlserver.client_pid,sqlserver.database_id,sqlserver.database_name,sqlserver.username,sqlserver.query_hash,sqlserver.session_id)
WHERE ([package0].[equal_boolean]([sqlserver].[is_system],(0))))
ADD TARGET package0.ring_buffer(SET max_events_limit=(1001))
WITH (MAX_MEMORY=16384KB,EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,MAX_DISPATCH_LATENCY=5 SECONDS,MAX_EVENT_SIZE=0 KB,MEMORY_PARTITION_MODE=PER_CPU,TRACK_CAUSALITY=ON,STARTUP_STATE=OFF)";
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -23,26 +23,26 @@ DROP EVENT SESSION [{sessionName}] ON SERVER
END

CREATE EVENT SESSION [{sessionName}] ON SERVER
ADD EVENT sqlserver.attention(
ACTION(package0.event_sequence,sqlserver.client_app_name,sqlserver.client_pid,sqlserver.database_id,sqlserver.nt_username,sqlserver.query_hash,sqlserver.server_principal_name,sqlserver.session_id)
WHERE ([package0].[equal_boolean]([sqlserver].[is_system],(0)))),
ADD EVENT sqlserver.existing_connection(SET collect_options_text=(1)
ACTION(package0.event_sequence,sqlserver.client_app_name,sqlserver.client_pid,sqlserver.nt_username,sqlserver.server_principal_name,sqlserver.session_id)),
ADD EVENT sqlserver.login(SET collect_options_text=(1)
ACTION(package0.event_sequence,sqlserver.client_app_name,sqlserver.client_pid,sqlserver.nt_username,sqlserver.server_principal_name,sqlserver.session_id)),
ADD EVENT sqlserver.logout(
ACTION(package0.event_sequence,sqlserver.client_app_name,sqlserver.client_pid,sqlserver.nt_username,sqlserver.server_principal_name,sqlserver.session_id)),
ADD EVENT sqlserver.rpc_completed(
ACTION(package0.event_sequence,sqlserver.client_app_name,sqlserver.client_pid,sqlserver.database_id,sqlserver.database_name,sqlserver.nt_username,sqlserver.query_hash,sqlserver.server_principal_name,sqlserver.session_id)
WHERE ([package0].[equal_boolean]([sqlserver].[is_system],(0)))),
ADD EVENT sqlserver.sql_batch_completed(
ACTION(package0.event_sequence,sqlserver.client_app_name,sqlserver.client_pid,sqlserver.database_id,sqlserver.database_name,sqlserver.nt_username,sqlserver.query_hash,sqlserver.server_principal_name,sqlserver.session_id)
WHERE ([package0].[equal_boolean]([sqlserver].[is_system],(0)))),
ADD EVENT sqlserver.sql_batch_starting(
ACTION(package0.event_sequence,sqlserver.client_app_name,sqlserver.client_pid,sqlserver.database_id,sqlserver.database_name,sqlserver.nt_username,sqlserver.query_hash,sqlserver.server_principal_name,sqlserver.session_id)
WHERE ([package0].[equal_boolean]([sqlserver].[is_system],(0))))
ADD TARGET package0.ring_buffer(SET max_events_limit=(1001))
WITH (EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,MAX_DISPATCH_LATENCY=5 SECONDS,MAX_EVENT_SIZE=0 KB,MEMORY_PARTITION_MODE=PER_CPU,TRACK_CAUSALITY=ON,STARTUP_STATE=OFF)";
ADD EVENT sqlserver.attention(
ACTION(package0.event_sequence,sqlserver.client_app_name,sqlserver.client_hostname,sqlserver.client_pid,sqlserver.database_id,sqlserver.nt_username,sqlserver.query_hash,sqlserver.server_principal_name,sqlserver.session_id)
WHERE ([package0].[equal_boolean]([sqlserver].[is_system],(0)))),
ADD EVENT sqlserver.existing_connection(SET collect_options_text=(1)
ACTION(package0.event_sequence,sqlserver.client_app_name,sqlserver.client_hostname,sqlserver.client_pid,sqlserver.nt_username,sqlserver.server_principal_name,sqlserver.session_id)),
ADD EVENT sqlserver.login(SET collect_options_text=(1)
ACTION(package0.event_sequence,sqlserver.client_app_name,sqlserver.client_hostname,sqlserver.client_pid,sqlserver.nt_username,sqlserver.server_principal_name,sqlserver.session_id)),
ADD EVENT sqlserver.logout(
ACTION(package0.event_sequence,sqlserver.client_app_name,sqlserver.client_hostname,sqlserver.client_pid,sqlserver.nt_username,sqlserver.server_principal_name,sqlserver.session_id)),
ADD EVENT sqlserver.rpc_completed(
ACTION(package0.event_sequence,sqlserver.client_app_name,sqlserver.client_hostname,sqlserver.client_pid,sqlserver.database_id,sqlserver.database_name,sqlserver.nt_username,sqlserver.query_hash,sqlserver.server_principal_name,sqlserver.session_id)
WHERE ([package0].[equal_boolean]([sqlserver].[is_system],(0)))),
ADD EVENT sqlserver.sql_batch_completed(
ACTION(package0.event_sequence,sqlserver.client_app_name,sqlserver.client_hostname,sqlserver.client_pid,sqlserver.database_id,sqlserver.database_name,sqlserver.nt_username,sqlserver.query_hash,sqlserver.server_principal_name,sqlserver.session_id)
WHERE ([package0].[equal_boolean]([sqlserver].[is_system],(0)))),
ADD EVENT sqlserver.sql_batch_starting(
ACTION(package0.event_sequence,sqlserver.client_app_name,sqlserver.client_hostname,sqlserver.client_pid,sqlserver.database_id,sqlserver.database_name,sqlserver.nt_username,sqlserver.query_hash,sqlserver.server_principal_name,sqlserver.session_id)
WHERE ([package0].[equal_boolean]([sqlserver].[is_system],(0))))
ADD TARGET package0.ring_buffer(SET max_events_limit=(1001))
WITH (MAX_MEMORY=16384KB,EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,MAX_DISPATCH_LATENCY=5 SECONDS,MAX_EVENT_SIZE=0 KB,MEMORY_PARTITION_MODE=PER_CPU,TRACK_CAUSALITY=ON,STARTUP_STATE=OFF)";
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,12 @@ public DefaultProfilerViewTemplate()
EventsMapped = new List<string>() { "client_app_name" }
});

Columns.Add(new ColumnViewTemplate()
{
Name = "HostName",
EventsMapped = new List<string>() { "client_hostname" }
});

Columns.Add(new ColumnViewTemplate()
{
Name = "NTUserName",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
<ImplicitUsings>enable</ImplicitUsings>
<EnableWindowsTargeting>true</EnableWindowsTargeting>
<AssemblyName>LightQueryProfiler</AssemblyName>
<Version>1.2.0-dev.2</Version>
<Version>1.2.0-dev.3</Version>
<FileVersion>1.2.0</FileVersion>
<AssemblyVersion>1.2.0</AssemblyVersion>
<ApplicationIcon>Icons\light-query-profiler.ico</ApplicationIcon>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1005,7 +1005,7 @@ private async void OnImportEvents(object? sender, EventArgs e)
// Add rows in the correct order
foreach (var eventData in importResult.Events)
{
var rowValues = new List<object?>();
var rowValues = new List<object>();
foreach (var columnName in importResult.ColumnNames)
{
eventData.TryGetValue(columnName, out var value);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using LightQueryProfiler.Shared.Enums;
using LightQueryProfiler.Shared.Extensions;
using LightQueryProfiler.Shared.Models;
using LightQueryProfiler.Shared.Repositories.Interfaces;
using LightQueryProfiler.WinFormsApp.Views;
Expand Down Expand Up @@ -50,7 +51,7 @@ private void View_CellDoubleClick(object? sender, EventArgs e)
}

Connection connection = new(Convert.ToInt32(row.Cells[nameof(Connection.Id)].Value),
string.Empty,
row.Cells[nameof(Connection.InitialCatalog)].Value?.ToString() ?? string.Empty,
Convert.ToDateTime(row.Cells["Creation Date"].Value),
row.Cells[nameof(Connection.DataSource)].Value?.ToString() ?? string.Empty,
Convert.ToBoolean(row.Cells[nameof(Connection.IntegratedSecurity)].Value),
Expand Down Expand Up @@ -133,6 +134,14 @@ private void View_RecentConnectionsGridView_CellFormatting(object? sender, Event
_event.Value = new string('*', _event.Value.ToString()?.Length ?? 0);
_event.FormattingApplied = true;
}
else if (view.RecentConnectionsGridView.Columns[_event.ColumnIndex].Name == nameof(Connection.AuthenticationMode) && _event.Value != null)
{
if (int.TryParse(_event.Value.ToString(), out int modeValue))
{
_event.Value = ((AuthenticationMode)modeValue).GetString();
_event.FormattingApplied = true;
}
}
}
}

Expand All @@ -141,6 +150,7 @@ private DataTable GetDataTable(List<Connection> connections)
DataTable table = new DataTable();
table.Columns.Add(nameof(Connection.Id), typeof(int));
table.Columns.Add(nameof(Connection.DataSource), typeof(string));
table.Columns.Add(nameof(Connection.InitialCatalog), typeof(string));
table.Columns.Add(nameof(Connection.UserId), typeof(string));
table.Columns.Add(nameof(Connection.Password), typeof(string));
table.Columns.Add(nameof(Connection.IntegratedSecurity), typeof(bool));
Expand All @@ -155,6 +165,7 @@ private DataTable GetDataTable(List<Connection> connections)
DataRow row = table.NewRow();
row[nameof(Connection.Id)] = c.Id;
row[nameof(Connection.DataSource)] = c.DataSource;
row[nameof(Connection.InitialCatalog)] = (object?)c.InitialCatalog ?? DBNull.Value;
row[nameof(Connection.UserId)] = (object?)c.UserId ?? DBNull.Value;
row[nameof(Connection.Password)] = (object?)c.Password ?? DBNull.Value;
row[nameof(Connection.IntegratedSecurity)] = c.IntegratedSecurity;
Expand Down
11 changes: 11 additions & 0 deletions vscode-extension/src/models/profiler-event.ts
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,11 @@ export interface ProfilerEventRow {
*/
applicationName?: string;

/**
* Client host name
*/
hostname?: string;

/**
* Database name
*/
Expand Down Expand Up @@ -148,6 +153,11 @@ export function toEventRow(event: ProfilerEvent): ProfilerEventRow {
? actions['client_app_name']
: undefined;

const hostname =
typeof actions['client_hostname'] === 'string'
? actions['client_hostname']
: undefined;

const databaseName =
typeof actions['database_name'] === 'string'
? actions['database_name']
Expand All @@ -170,6 +180,7 @@ export function toEventRow(event: ProfilerEvent): ProfilerEventRow {
reads,
writes,
applicationName,
hostname,
databaseName,
loginName,
sessionId,
Expand Down
32 changes: 28 additions & 4 deletions vscode-extension/src/views/profiler-panel-provider.ts
Original file line number Diff line number Diff line change
Expand Up @@ -336,6 +336,7 @@ export class ProfilerPanelProvider {
reads: number;
databaseName?: string;
applicationName?: string;
hostname?: string;
queryText?: string;
}> = [];

Expand All @@ -349,6 +350,7 @@ export class ProfilerPanelProvider {
reads: (event.fields?.logical_reads as number) || 0,
databaseName: event.actions?.database_name as string | undefined,
applicationName: event.actions?.client_app_name as string | undefined,
hostname: event.actions?.client_hostname as string | undefined,
queryText: event.fields?.statement as string | undefined,
};

Expand Down Expand Up @@ -769,11 +771,12 @@ export class ProfilerPanelProvider {
<th>Reads</th>
<th>Database</th>
<th>Application</th>
<th>Host</th>
</tr>
</thead>
<tbody id="eventsTableBody">
<tr>
<td colspan="7" class="no-events">No events captured yet. Click Start to begin profiling.</td>
<td colspan="8" class="no-events">No events captured yet. Click Start to begin profiling.</td>
</tr>
</tbody>
</table>
Expand Down Expand Up @@ -810,7 +813,7 @@ export class ProfilerPanelProvider {
// Update auth mode visibility
authMode.addEventListener('change', () => {
const mode = parseInt(authMode.value);
const requiresCredentials = mode === 1 || mode === 3;
const requiresCredentials = mode === 1 || mode === 2;

if (requiresCredentials) {
usernameGroup.classList.remove('hidden');
Expand All @@ -824,6 +827,18 @@ export class ProfilerPanelProvider {
// Trigger initial visibility update
authMode.dispatchEvent(new Event('change'));

// Restore previously saved connection settings
const savedState = vscode.getState();
if (savedState) {
if (savedState.server) { serverInput.value = savedState.server; }
if (savedState.database) { databaseInput.value = savedState.database; }
if (typeof savedState.authenticationMode === 'number') {
authMode.value = String(savedState.authenticationMode);
authMode.dispatchEvent(new Event('change'));
}
if (savedState.username) { usernameInput.value = savedState.username; }
}

// Button event handlers
startBtn.addEventListener('click', () => {
const settings = {
Expand All @@ -834,6 +849,14 @@ export class ProfilerPanelProvider {
password: passwordInput.value || undefined
};

// Persist connection settings (excluding password for security)
vscode.setState({
server: settings.server,
database: settings.database,
authenticationMode: settings.authenticationMode,
username: settings.username,
});

vscode.postMessage({ command: 'start', data: settings });
});

Expand Down Expand Up @@ -911,7 +934,7 @@ export class ProfilerPanelProvider {
// Remove "no events" message if present
if (eventsTableBody.children.length === 1 &&
eventsTableBody.children[0].children.length === 1 &&
eventsTableBody.children[0].children[0].colSpan === 7) {
eventsTableBody.children[0].children[0].colSpan === 8) {
eventsTableBody.innerHTML = '';
}

Expand All @@ -923,7 +946,8 @@ export class ProfilerPanelProvider {
'<td>' + formatNumber(event.cpuTime) + '</td>' +
'<td>' + formatNumber(event.reads) + '</td>' +
'<td>' + escapeHtml(event.databaseName || '-') + '</td>' +
'<td>' + escapeHtml(event.applicationName || '-') + '</td>';
'<td>' + escapeHtml(event.applicationName || '-') + '</td>' +
'<td>' + escapeHtml(event.hostname || '-') + '</td>';

row.addEventListener('click', () => {
selectRow(row, event);
Expand Down
Loading
Loading