Published
Edited
Dec 13, 2021
Insert cell
# Render Datasette traces (prototype with longer SQL display)

This is now a Datasette plugin: https://github.com/simonw/datasette-pretty-traces
Insert cell
min_start = Math.min(...traces.map((t) => t.start))
Insert cell
max_end = Math.max(...traces.map((t) => t.end))
Insert cell
width_s = max_end - min_start
Insert cell
html`<div style="background-color: #eee; font-family: courier; font-size: 0.6em;">${traces_sorted.map(
(trace) => {
let trace_width_s = trace.end - trace.start;
let ms = trace_width_s * 1000;
let w = (trace_width_s / width_s) * width;
var left_s = trace.start - min_start;
let left = (left_s / width_s) * width;
var sql = trace.sql.replace(/\n/g, " ");
let traceback = trace.traceback.map(
(s) => s.split("datasette").slice(-1)[0]
);
console.log(trace);
return `<div style="position: relative; border-bottom: 3px solid white; height: 1.4em; overflow: hidden" title="${ms.toFixed(
2
)}ms ${escapeHtml(
JSON.stringify(traceback, null, 4)
)}">${sql}<div style="position: absolute; top: 0; left: ${left}px; overflow: hidden; background-color: #ccc; border: 1px solid black; margin-bottom: 2px; height: 1.25em; width: ${w}px; opacity: 0.5"></div></div>`;
}
)}</div>`
Insert cell
traces_sorted = traces.sort((t1, t2) => t1.start - t2.start)
Insert cell
JSON.stringify(traces[0], null, 4)
Insert cell
traces = [
{
type: "sql",
start: 832935.956284345,
end: 832935.956558248,
duration_ms: 0.2739030169323087,
traceback: [
' File "/Users/simon/Dropbox/Development/datasette/datasette/views/base.py", line 123, in dispatch_request\n await self.ds.refresh_schemas()\n',
' File "/Users/simon/Dropbox/Development/datasette/datasette/app.py", line 346, in refresh_schemas\n await self._refresh_schemas()\n',
' File "/Users/simon/Dropbox/Development/datasette/datasette/app.py", line 356, in _refresh_schemas\n for row in await internal_db.execute(\n'
],
database: "_internal",
sql: "select database_name, schema_version from databases",
params: null
},
{
type: "sql",
start: 832935.956770934,
end: 832935.95705092,
duration_ms: 0.27998595032840967,
traceback: [
' File "/Users/simon/Dropbox/Development/datasette/datasette/views/base.py", line 123, in dispatch_request\n await self.ds.refresh_schemas()\n',
' File "/Users/simon/Dropbox/Development/datasette/datasette/app.py", line 346, in refresh_schemas\n await self._refresh_schemas()\n',
' File "/Users/simon/Dropbox/Development/datasette/datasette/app.py", line 361, in _refresh_schemas\n schema_version = (await db.execute("PRAGMA schema_version")).first()[0]\n'
],
database: "_internal",
sql: "PRAGMA schema_version",
params: null
},
{
type: "sql",
start: 832935.957221446,
end: 832935.95746167,
duration_ms: 0.24022406432777643,
traceback: [
' File "/Users/simon/Dropbox/Development/datasette/datasette/views/base.py", line 123, in dispatch_request\n await self.ds.refresh_schemas()\n',
' File "/Users/simon/Dropbox/Development/datasette/datasette/app.py", line 346, in refresh_schemas\n await self._refresh_schemas()\n',
' File "/Users/simon/Dropbox/Development/datasette/datasette/app.py", line 361, in _refresh_schemas\n schema_version = (await db.execute("PRAGMA schema_version")).first()[0]\n'
],
database: "covid",
sql: "PRAGMA schema_version",
params: null
},
{
type: "sql",
start: 832935.957720802,
end: 832935.958000995,
duration_ms: 0.28019293677061796,
traceback: [
' File "/Users/simon/Dropbox/Development/datasette/datasette/views/table.py", line 349, in data\n is_view = bool(await db.get_view_definition(table))\n',
' File "/Users/simon/Dropbox/Development/datasette/datasette/database.py", line 393, in get_view_definition\n return await self.get_table_definition(view, "view")\n',
' File "/Users/simon/Dropbox/Development/datasette/datasette/database.py", line 373, in get_table_definition\n await self.execute(\n'
],
database: "covid",
sql: "select sql from sqlite_master where name = :n and type=:t",
params: {
n: "ny_times_us_counties",
t: "view"
}
},
{
type: "sql",
start: 832935.958160883,
end: 832935.95842717,
duration_ms: 0.26628689374774694,
traceback: [
' File "/Users/simon/Dropbox/Development/datasette/datasette/views/base.py", line 477, in view_get\n response_or_template_contexts = await self.data(\n',
' File "/Users/simon/Dropbox/Development/datasette/datasette/views/table.py", line 350, in data\n table_exists = bool(await db.table_exists(table))\n',
' File "/Users/simon/Dropbox/Development/datasette/datasette/database.py", line 258, in table_exists\n results = await self.execute(\n'
],
database: "covid",
sql: "select 1 from sqlite_master where type='table' and name=?",
params: ["ny_times_us_counties"]
},
{
type: "sql",
start: 832935.960406535,
end: 832935.96088644,
duration_ms: 0.4799050511792302,
traceback: [
' File "/Users/simon/Dropbox/Development/datasette/datasette/views/base.py", line 262, in get\n return await self.view_get(\n',
' File "/Users/simon/Dropbox/Development/datasette/datasette/views/base.py", line 477, in view_get\n response_or_template_contexts = await self.data(\n',
' File "/Users/simon/Dropbox/Development/datasette/datasette/views/table.py", line 700, in data\n results = await db.execute(sql, params, truncate=True, **extra_args)\n'
],
database: "covid",
sql:
"select rowid, date, county, state, fips, cases, deaths from ny_times_us_counties order by rowid limit 101",
params: {}
},
{
type: "sql",
start: 832935.961052344,
end: 832935.968458546,
duration_ms: 7.406202028505504,
traceback: [
' File "/Users/simon/Dropbox/Development/datasette/datasette/views/base.py", line 262, in get\n return await self.view_get(\n',
' File "/Users/simon/Dropbox/Development/datasette/datasette/views/base.py", line 477, in view_get\n response_or_template_contexts = await self.data(\n',
' File "/Users/simon/Dropbox/Development/datasette/datasette/views/table.py", line 718, in data\n count_rows = list(await db.execute(count_sql, from_sql_params))\n'
],
database: "covid",
sql: "select count(*) from ny_times_us_counties",
params: {}
},
{
type: "sql",
start: 832935.969390799,
end: 832935.969774433,
duration_ms: 0.38363400381058455,
traceback: [
' File "/Users/simon/Dropbox/Development/datasette/datasette/facets.py", line 146, in suggest\n columns = await self.get_columns(self.sql, self.params)\n',
' File "/Users/simon/Dropbox/Development/datasette/datasette/facets.py", line 124, in get_columns\n await self.ds.execute(\n',
' File "/Users/simon/Dropbox/Development/datasette/datasette/app.py", line 635, in execute\n return await self.databases[db_name].execute(\n'
],
database: "covid",
sql:
"select * from (select rowid, date, county, state, fips, cases, deaths from ny_times_us_counties ) limit 0",
params: []
},
{
type: "sql",
start: 832935.970052234,
end: 832935.97039335,
duration_ms: 0.3411159850656986,
traceback: [
' File "/Users/simon/Dropbox/Development/datasette/datasette/views/table.py", line 851, in data\n suggested_facets.extend(await facet.suggest())\n',
' File "/Users/simon/Dropbox/Development/datasette/datasette/facets.py", line 164, in suggest\n distinct_values = await self.ds.execute(\n',
' File "/Users/simon/Dropbox/Development/datasette/datasette/app.py", line 635, in execute\n return await self.databases[db_name].execute(\n'
],
database: "covid",
sql:
"select rowid, count(*) as n from (\n select rowid, date, county, state, fips, cases, deaths from ny_times_us_counties \n ) where rowid is not null\n group by rowid\n limit 31",
params: []
},
{
type: "sql",
start: 832935.970569481,
end: 832935.971116236,
duration_ms: 0.546754919923842,
traceback: [
' File "/Users/simon/Dropbox/Development/datasette/datasette/views/table.py", line 851, in data\n suggested_facets.extend(await facet.suggest())\n',
' File "/Users/simon/Dropbox/Development/datasette/datasette/facets.py", line 164, in suggest\n distinct_values = await self.ds.execute(\n',
' File "/Users/simon/Dropbox/Development/datasette/datasette/app.py", line 635, in execute\n return await self.databases[db_name].execute(\n'
],
database: "covid",
sql:
"select date, count(*) as n from (\n select rowid, date, county, state, fips, cases, deaths from ny_times_us_counties \n ) where date is not null\n group by date\n limit 31",
params: []
},
{
type: "sql",
start: 832935.971294026,
end: 832935.974623287,
duration_ms: 3.3292609732598066,
traceback: [
' File "/Users/simon/Dropbox/Development/datasette/datasette/views/table.py", line 851, in data\n suggested_facets.extend(await facet.suggest())\n',
' File "/Users/simon/Dropbox/Development/datasette/datasette/facets.py", line 164, in suggest\n distinct_values = await self.ds.execute(\n',
' File "/Users/simon/Dropbox/Development/datasette/datasette/app.py", line 635, in execute\n return await self.databases[db_name].execute(\n'
],
database: "covid",
sql:
"select county, count(*) as n from (\n select rowid, date, county, state, fips, cases, deaths from ny_times_us_counties \n ) where county is not null\n group by county\n limit 31",
params: []
},
{
type: "sql",
start: 832936.025580217,
end: 832936.027121663,
duration_ms: 1.5414459630846977,
traceback: [
' File "/Users/simon/Dropbox/Development/datasette/datasette/views/table.py", line 851, in data\n suggested_facets.extend(await facet.suggest())\n',
' File "/Users/simon/Dropbox/Development/datasette/datasette/facets.py", line 164, in suggest\n distinct_values = await self.ds.execute(\n',
' File "/Users/simon/Dropbox/Development/datasette/datasette/app.py", line 635, in execute\n return await self.databases[db_name].execute(\n'
],
database: "covid",
sql:
"select fips, count(*) as n from (\n select rowid, date, county, state, fips, cases, deaths from ny_times_us_counties \n ) where fips is not null\n group by fips\n limit 31",
params: []
},
{
type: "sql",
start: 832936.302856808,
end: 832936.303117902,
duration_ms: 0.2610940719023347,
traceback: [
' File "/Users/simon/Dropbox/Development/datasette/datasette/facets.py", line 439, in suggest\n columns = await self.get_columns(self.sql, self.params)\n',
' File "/Users/simon/Dropbox/Development/datasette/datasette/facets.py", line 124, in get_columns\n await self.ds.execute(\n',
' File "/Users/simon/Dropbox/Development/datasette/datasette/app.py", line 635, in execute\n return await self.databases[db_name].execute(\n'
],
database: "covid",
sql:
"select * from (select rowid, date, county, state, fips, cases, deaths from ny_times_us_counties ) limit 0",
params: []
},
{
type: "sql",
start: 832936.3537647,
end: 832936.354193954,
duration_ms: 0.42925402522087097,
traceback: [
' File "/Users/simon/Dropbox/Development/datasette/datasette/views/table.py", line 851, in data\n suggested_facets.extend(await facet.suggest())\n',
' File "/Users/simon/Dropbox/Development/datasette/datasette/facets.py", line 454, in suggest\n results = await self.ds.execute(\n',
' File "/Users/simon/Dropbox/Development/datasette/datasette/app.py", line 635, in execute\n return await self.databases[db_name].execute(\n'
],
database: "covid",
sql:
'select date(date) from (\n select rowid, date, county, state, fips, cases, deaths from ny_times_us_counties \n ) where date glob "????-??-*" limit 100;',
params: []
},
{
type: "sql",
start: 832936.607108564,
end: 832936.607372318,
duration_ms: 0.2637540455907583,
traceback: [
' File "/Users/simon/Dropbox/Development/datasette/datasette/facets.py", line 287, in suggest\n columns = await self.get_columns(self.sql, self.params)\n',
' File "/Users/simon/Dropbox/Development/datasette/datasette/facets.py", line 124, in get_columns\n await self.ds.execute(\n',
' File "/Users/simon/Dropbox/Development/datasette/datasette/app.py", line 635, in execute\n return await self.databases[db_name].execute(\n'
],
database: "covid",
sql:
"select * from (select rowid, date, county, state, fips, cases, deaths from ny_times_us_counties ) limit 0",
params: []
},
{
type: "sql",
start: 832936.816156038,
end: 832936.816418047,
duration_ms: 0.26200897991657257,
traceback: [
' File "/Users/simon/Dropbox/Development/datasette/datasette/views/table.py", line 958, in extra_template\n "view_definition": await db.get_view_definition(table),\n',
' File "/Users/simon/Dropbox/Development/datasette/datasette/database.py", line 393, in get_view_definition\n return await self.get_table_definition(view, "view")\n',
' File "/Users/simon/Dropbox/Development/datasette/datasette/database.py", line 373, in get_table_definition\n await self.execute(\n'
],
database: "covid",
sql: "select sql from sqlite_master where name = :n and type=:t",
params: {
n: "ny_times_us_counties",
t: "view"
}
},
{
type: "sql",
start: 832936.81657506,
end: 832936.816778226,
duration_ms: 0.20316604059189558,
traceback: [
' File "/Users/simon/Dropbox/Development/datasette/datasette/views/base.py", line 572, in view_get\n extras = await extras\n',
' File "/Users/simon/Dropbox/Development/datasette/datasette/views/table.py", line 959, in extra_template\n "table_definition": await db.get_table_definition(table),\n',
' File "/Users/simon/Dropbox/Development/datasette/datasette/database.py", line 373, in get_table_definition\n await self.execute(\n'
],
database: "covid",
sql: "select sql from sqlite_master where name = :n and type=:t",
params: {
n: "ny_times_us_counties",
t: "table"
}
},
{
type: "sql",
start: 832936.816896465,
end: 832936.81709127,
duration_ms: 0.1948049757629633,
traceback: [
' File "/Users/simon/Dropbox/Development/datasette/datasette/views/base.py", line 572, in view_get\n extras = await extras\n',
' File "/Users/simon/Dropbox/Development/datasette/datasette/views/table.py", line 959, in extra_template\n "table_definition": await db.get_table_definition(table),\n',
' File "/Users/simon/Dropbox/Development/datasette/datasette/database.py", line 383, in get_table_definition\n await self.execute(\n'
],
database: "covid",
sql:
"select sql from sqlite_master where tbl_name = :n and type='index' and sql is not null",
params: {
n: "ny_times_us_counties"
}
}
]
Insert cell
function escapeHtml(unsafe) {
return unsafe
.replace(/&/g, "&amp;")
.replace(/</g, "&lt;")
.replace(/>/g, "&gt;")
.replace(/"/g, "&quot;")
.replace(/'/g, "&#039;");
}
Insert cell

Purpose-built for displays of data

Observable is your go-to platform for exploring data and creating expressive data visualizations. Use reactive JavaScript notebooks for prototyping and a collaborative canvas for visual data exploration and dashboard creation.
Learn more