MiniProfiler
Understands how to store a to a MSSQL database.
Understands how to save MiniProfiler results to a MSSQL database, allowing more permanent storage and
querying of slow results.
Provides saving and loading s to a storage medium.
Returns a list of profile guids (optionally in a particular date range)
defaults to decending
Stores under its .
The results of a profiling session.
Should also ensure the profiler is stored as being unviewed by its profiling .
Returns a from storage based on , which should map to .
Should also update that the resulting profiler has been marked as viewed by its profiling .
Sets a particular profiler session so it is considered "unviewed"
Sets a particular profiler session to "viewed"
Returns a list of s that haven't been seen by .
User identified by the current .
Returns a new SqlServerDatabaseStorage object that will insert into the database identified by connectionString.
Saves 'profiler' to a database under its .
Returns the MiniProfiler identified by 'id' from the database or null when no MiniProfiler exists under that 'id'.
Sets a particular profiler session so it is considered "unviewed"
Sets a particular profiler session to "viewed"
Returns a list of s that haven't been seen by .
User identified by the current .
Implement a basic list search here
Returns a DbConnection for your specific provider.
Returns a DbConnection already opened for execution.
Giving freshly selected collections, this method puts them in the correct
hierarchy under the 'result' MiniProfiler.
How we connect to the database used to save/load MiniProfiler results.
Creates needed tables. Run this once on your database.
Works in sql server and sqlite (with documented removals).
TODO: add indexes
Returns a new .
Stores to dbo.MiniProfilers under its ;
stores all child Timings and SqlTimings to their respective tables.
Saves parameter Timing to the dbo.MiniProfilerTimings table.
Saves parameter SqlTiming to the dbo.MiniProfilerSqlTimings table.
Saves any SqlTimingParameters used in the profiled SqlTiming to the dbo.MiniProfilerSqlTimingParameters table.
Loads the MiniProfiler identifed by 'id' from the database.
sets the session to unviewed
sets the session to viewed
Returns a list of s that haven't been seen by .
User identified by the current .
Returns a connection to Sql Server.
A full install of Sql Server can return multiple result sets in one query, allowing the use of .
However, Sql Server CE and Sqlite cannot do this, so inheritors for those providers can return false here.
Wrapper for a db provider factory to enable profiling
Every provider factory must have an Instance public field
Used for db provider apis internally
Allow to re-init the provider factory.
proxy
proxy
proxy
proxy
proxy
proxy
proxy
proxy
proxy
proxy
Dapper, a light weight object mapper for ADO.NET
Purge the query cache
Return a count of all the cached queries by dapper
Return a list of all the queries cached by dapper
Deep diagnostics only: find any hash collisions in the cache
Execute parameterized SQL
Number of rows affected
Return a list of dynamic objects, reader is closed after the call
Executes a query, returning the data typed as per T
the dynamic param may seem a bit odd, but this works around a major usability issue in vs, if it is Object vs completion gets annoying. Eg type new [space] get new object
A sequence of data of the supplied type; if a basic type (int, string, etc) is queried then the data from the first column in assumed, otherwise an instance is
created per row, and a direct column-name===member-name mapping is assumed (case insensitive).
Execute a command that returns multiple result sets, and access each in turn
Return a typed list of objects, reader is closed after the call
Maps a query to objects
The first type in the recordset
The second type in the recordset
The return type
The Field we should split and read the second object from (default: id)
Number of seconds before command execution timeout
Is it a stored proc or a batch?
Maps a query to objects
The Field we should split and read the second object from (default: id)
Number of seconds before command execution timeout
Perform a multi mapping query with 4 input parameters
Perform a multi mapping query with 5 input parameters
Internal use only
Internal use only
Internal use only
Internal use only
Internal use only
Throws a data exception, only used internally
Called if the query cache is purged via PurgeQueryCache
Implement this interface to pass an arbitrary db specific set of parameters to Dapper
Add all the parameters needed to the command just before it executes
The raw command prior to execution
Information about the query
This is a micro-cache; suitable when the number of terms is controllable (a few hundred, for example),
and strictly append-only; you cannot change existing values. All key matches are on **REFERENCE**
equality. The type is fully thread-safe.
Identity of a cached query in Dapper, used for extensability
Create an identity for use with DynamicParameters, internal use only
The sql
The command type
Compare 2 Identity objects
The grid reader provides interfaces for reading multiple result sets from a Dapper query
Read the next grid of results
Read multiple objects from a single recordset on the grid
Read multiple objects from a single recordset on the grid
Read multiple objects from a single record set on the grid
Read multiple objects from a single record set on the grid
Dispose the grid, closing and disposing both the underlying reader and command.
A bag of parameters that can be passed to the Dapper Query and Execute methods
construct a dynamic parameter bag
construct a dynamic parameter bag
can be an anonymous type of a DynamicParameters bag
Append a whole object full of params to the dynamic
EG: AddParams(new {A = 1, B = 2}) // will add property A and B to the dynamic
Add a parameter to this dynamic parameter list
Get the value of a parameter
The value, note DBNull.Value is not returned, instead the value is returned as null
This class represents a SQL string, it can be used if you need to denote your parameter is a Char vs VarChar vs nVarChar vs nChar
Create a new DbString
Add the parameter to the command... internal use only
Ansi vs Unicode
Fixed length
Length of the string -1 for max
The value of the string
Provides functionality to identify which user is profiling a request.
Returns a string to identify the user profiling the current 'request'.
The current HttpRequest being profiled.
Common extension methods to use only in this project
Answers true if this String is either null or empty.
Answers true if this String is neither null or empty.
Removes trailing / characters from a path and leaves just one
Removes any leading / characters from a path
Removes any leading / characters from a path
Serializes to a json string.
Provides a wrapper around a native DbDataAdapter, allowing a profiled Fill operation.
This static variable is simply used as a non-null placeholder in the MiniProfiler.ExecuteFinish method
Initializes a new instance of the class.
The wrapped adapter.
The profiler instance or null to get the current instance.
Adds a named "Table" to the specified and configures the schema to match that in the data source based on the specified .
The to be filled with the schema from the data source.
One of the values.
An array of objects that contain schema information returned from the data source.
Adds or updates rows in the to match those in the data source using the name, and creates a named "Table".
A to fill with records and, if necessary, schema.
The number of rows successfully added to or refreshed in the . This does not include rows affected by statements that do not return rows.
Gets the parameters set by the user when executing an SQL SELECT statement.
An array of objects that contains the parameters set by the user.
Calls the respective INSERT, UPDATE, or DELETE statements for each inserted, updated, or deleted row in the specified from a named "Table".
The used to update the data source.
The number of rows successfully updated from the .
An attempt to execute an INSERT, UPDATE, or DELETE statement resulted in zero records affected.
Indicates or specifies whether unmapped source tables or columns are passed with their source names in order to be filtered or to raise an error.
One of the values. The default is Passthrough.
The value set is not one of the values.
Indicates or specifies whether missing source tables, columns, and their relationships are added to the dataset schema, ignored, or cause an error to be raised.
One of the values. The default is Add.
The value set is not one of the values.
Indicates how a source table is mapped to a dataset table.
A collection that provides the master mapping between the returned records and the . The default value is an empty collection.
Gets or sets an SQL statement used to select records in the data source.
An that is used during to select records from data source for placement in the data set.
Gets or sets an SQL statement used to insert new records into the data source.
An used during to insert records in the data source for new rows in the data set.
Gets or sets an SQL statement used to update records in the data source.
An used during to update records in the data source for modified rows in the data set.
Gets or sets an SQL statement for deleting records from the data set.
An used during to delete records in the data source for deleted rows in the data set.
Profiles a single sql execution.
Holds the maximum size that will be stored for byte[] parameters
Creates a new SqlTiming to profile 'command'.
Obsolete - used for serialization.
Returns a snippet of the sql command and the duration.
Returns true if Ids match.
Returns hashcode of Id.
Called when command execution is finished to determine this SqlTiming's duration.
Called when database reader is closed, ending profiling for SqlTimings.
To help with display, put some space around sammiched commas
Unique identifier for this SqlTiming.
Category of sql statement executed.
The sql that was executed.
The command string with special formatting applied based on MiniProfiler.Settings.SqlFormatter
Roughly where in the calling code that this sql was executed.
Offset from main MiniProfiler start that this sql began.
How long this sql statement took to execute.
When executing readers, how long it took to come back initially from the database,
before all records are fetched and reader is closed.
Stores any parameter names and values used by the profiled DbCommand.
Id of the Timing this statement was executed in.
Needed for database deserialization.
The Timing step that this sql execution occurred in.
True when other identical sql statements have been executed during this MiniProfiler session.
Information about a DbParameter used in the sql statement profiled by SqlTiming.
Returns true if this has the same parent , and as .
Returns the XOR of certain properties.
Which SqlTiming this Parameter was executed with.
Parameter name, e.g. "@routeName"
The value submitted to the database.
System.Data.DbType, e.g. "String", "Bit"
How large the type is, e.g. for string, size could be 4000
Formats any SQL query with inline parameters, optionally including the value type
Takes a SqlTiming and returns a formatted SQL string, for parameter replacement, etc.
Return SQL the way you want it to look on the in the trace. Usually used to format parameters
Formatted SQL
Creates a new Inline SQL Formatter, optionally including the parameter type info in comments beside the replaced value
whether to include a comment after the value, indicating the type, e.g. /* @myParam DbType.Int32 */
Formats the SQL in a generic frieldly format, including the parameter type information in a comment if it was specified in the InlineFormatter constructor
The SqlTiming to format
A formatted SQL string
Returns a string representation of the parameter's value, including the type
The parameter to get a value for
HttpContext based profiler provider. This is the default provider to use in a web context.
The current profiler is associated with a HttpContext.Current ensuring that profilers are
specific to a individual HttpRequest.
BaseProfilerProvider. This providers some helper methods which provide access to
internals not otherwise available.
To use, override the , and
methods.
A provider used to create instances and maintain the current instance.
Starts a new MiniProfiler and sets it to be current. By the end of this method
should return the new MiniProfiler.
Ends the current profiling session, if one exists.
When true, clears the for this HttpContext, allowing profiling to
be prematurely stopped and discarded. Useful for when a specific route does not need to be profiled.
Returns the current MiniProfiler. This is used by .
Starts a new MiniProfiler and sets it to be current. By the end of this method
should return the new MiniProfiler.
Stops the current MiniProfiler (if any is currently running).
should be called if is false
If true, any current results will be thrown away and nothing saved
Returns the current MiniProfiler. This is used by .
Sets to be active (read to start profiling)
This should be called once a new MiniProfiler has been created.
The profiler to set to active
If is null
Stops the profiler and marks it as inactive.
The profiler to stop
True if successful, false if Stop had previously been called on this profiler
If is null
Calls to save the current
profiler using the current storage settings
Public constructor. This also registers any UI routes needed to display results
Starts a new MiniProfiler and associates it with the current .
Ends the current profiling session, if one exists.
When true, clears the for this HttpContext, allowing profiling to
be prematurely stopped and discarded. Useful for when a specific route does not need to be profiled.
Makes sure 'profiler' has a Name, pulling it from route data or url.
Returns the current profiler
Gets the currently running MiniProfiler for the current HttpContext; null if no MiniProfiler was ed.
WebRequestProfilerProvider specific configurations
Provides user identification for a given profiling request.
Understands how to route and respond to MiniProfiler UI urls.
Usually called internally, sometimes you may clear the routes during the apps lifecycle, if you do that call this to bring back mp
Returns this to handle .
Returns either includes' css/javascript or results' html.
Handles rendering static content files.
Handles rendering a previous MiniProfiler session, identified by its "?id=GUID" on the query.
Embedded resource contents keyed by filename.
Helper method that sets a proper 404 response code.
Try to keep everything static so we can easily be reused.
Oracle formatter for all your Oracle formatting needs
Does NOTHING, implement me!
Used to provide
This code needs to be inserted in the page before client timings work
You can wrap an html block with timing wrappers using this helper
This needs to be called at the begining of the layout for client side probe support, returns nothing if mini profiler is not enabled
To be used inline in razor pages - times a script be sure to call InitClientTimings first
To be used inline in razor pages - times a script be sure to call InitClientTimings first
To be used inline in razor pages - times a script be sure to call InitClientTimings first
This is a micro-cache; suitable when the number of terms is controllable (a few hundred, for example),
and strictly append-only; you cannot change existing values. All key matches are on **REFERENCE**
equality. The type is fully thread-safe.
A single MiniProfiler can be used to represent any number of steps/levels in a call-graph, via Step()
Totally baller.
A callback for ProfiledDbConnection and family
Called when a command starts executing
Called when a reader finishes executing
Called when a reader is done iterating through the data
Called when an error happens during execution of a command
True if the profiler instance is active
Starts when this profiler is instantiated. Each step will use this Stopwatch's current ticks as
their starting time.
Creates and starts a new MiniProfiler for the root , filtering steps to .
Returns the 's and this profiler recorded.
Returns true if Ids match.
Returns hashcode of Id.
Obsolete - used for serialization.
Walks the hierarchy contained in this profiler, starting with , and returns each Timing found.
Returns milliseconds based on Stopwatch's Frequency.
Starts a new MiniProfiler based on the current . This new profiler can be accessed by
Ends the current profiling session, if one exists.
When true, clears the for this HttpContext, allowing profiling to
be prematurely stopped and discarded. Useful for when a specific route does not need to be profiled.
Returns an that will time the code between its creation and disposal. Use this method when you
do not wish to include the StackExchange.Profiling namespace for the extension method.
A descriptive name for the code that is encapsulated by the resulting IDisposable's lifetime.
This step's visibility level; allows filtering when is called.
Returns the css and javascript includes needed to display the MiniProfiler results UI.
Which side of the page the profiler popup button should be displayed on (defaults to left)
Whether to show trivial timings by default (defaults to false)
Whether to show time the time with children column by default (defaults to false)
The maximum number of trace popups to show before removing the oldest (defaults to 15)
when true, shows buttons to minimize and clear MiniProfiler results
Whether MiniProfiler should attempt to load its own version of jQuery, or rely on a version previously loaded on the page
Script and link elements normally; an empty string when there is no active profiling session.
Renders the current to json.
Renders the parameter to json.
Deserializes the json string parameter to a .
Create a DEEP clone of this object
Returns all currently open commands on this connection
Returns all results contained in all child steps.
Contains any sql statements that are executed, along with how many times those statements are executed.
Adds to the current .
Returns the number of sql statements of that were executed in all s.
Identifies this Profiler so it may be stored/cached.
A display name for this profiling session.
When this profiler was instantiated.
Where this profiler was run.
Allows filtering of steps based on what
the steps are created with.
The first that is created and started when this profiler is instantiated.
All other s will be children of this one.
A string identifying the user/client that is profiling this request. Set
with an -implementing class to provide a custom value.
If this is not set manually at some point, the implementation will be used;
by default, this will be the current request's ip address.
Returns true when this MiniProfiler has been viewed by the that recorded it.
Allows POSTs that result in a redirect to be profiled. implementation
will keep a list of all profilers that haven't been fetched down.
Timings collected from the client
For unit testing, returns the timer.
Milliseconds, to one decimal place, that this MiniProfiler ran.
Returns true when or any of its are .
Returns true when all child s are .
Any Timing step with a duration less than or equal to this will be hidden by default in the UI; defaults to 2.0 ms.
Ticks since this MiniProfiler was started.
Points to the currently executing Timing.
Gets the currently running MiniProfiler for the current HttpContext; null if no MiniProfiler was ed.
Contains information about queries executed during this profiling session.
Milliseconds, to one decimal place, that this MiniProfiler was executing sql.
Returns true when we have profiled queries.
Returns true when any child Timings have duplicate queries.
How many sql data readers were executed in all steps.
How many sql scalar queries were executed in all steps.
How many sql non-query statements were executed in all steps.
Various configuration properties.
Excludes the specified assembly from the stack trace output.
The short name of the assembly. AssemblyName.Name
Excludes the specified type from the stack trace output.
The System.Type name to exclude
Excludes the specified method name from the stack trace output.
The name of the method
Make sure we can at least store profiler results to the http runtime cache.
Assemblies to exclude from the stack trace report.
Add to this using the method.
Types to exclude from the stack trace report.
Add to this using the method.
Methods to exclude from the stack trace report.
Add to this using the method.
The maximum number of unviewed profiler sessions (set this low cause we don't want to blow up headers)
The max length of the stack string to report back; defaults to 120 chars.
Any Timing step with a duration less than or equal to this will be hidden by default in the UI; defaults to 2.0 ms.
Dictates if the "time with children" column is displayed by default, defaults to false.
For a per-page override you can use .RenderIncludes(showTimeWithChildren: true/false)
Dictates if trivial timings are displayed by default, defaults to false.
For a per-page override you can use .RenderIncludes(showTrivial: true/false)
Determines how many traces to show before removing the oldest; defaults to 15.
For a per-page override you can use .RenderIncludes(maxTracesToShow: 10)
Dictates on which side of the page the profiler popup button is displayed; defaults to left.
For a per-page override you can use .RenderIncludes(position: RenderPosition.Left/Right)
Determines if min-max, clear, etc are rendered; defaults to false.
For a per-page override you can use .RenderIncludes(showControls: true/false)
By default, SqlTimings will grab a stack trace to help locate where queries are being executed.
When this setting is true, no stack trace will be collected, possibly improving profiler performance.
When is called, if the current request url contains any items in this property,
no profiler will be instantiated and no results will be displayed.
Default value is { "/content/", "/scripts/", "/favicon.ico" }.
The path under which ALL routes are registered in, defaults to the application root. For example, "~/myDirectory/" would yield
"/myDirectory/includes.js" rather than just "/mini-profiler-resources/includes.js"
Any setting here should be in APP RELATIVE FORM, e.g. "~/myDirectory/"
Maximum payload size for json responses in bytes defaults to 2097152 characters, which is equivalent to 4 MB of Unicode string data.
Understands how to save and load MiniProfilers. Used for caching between when
a profiling session ends and results can be fetched to the client, and for showing shared, full-page results.
The normal profiling session life-cycle is as follows:
1) request begins
2) profiler is started
3) normal page/controller/request execution
4) profiler is stopped
5) profiler is cached with 's implementation of
6) request ends
7) page is displayed and profiling results are ajax-fetched down, pulling cached results from
's implementation of
The formatter applied to the SQL being rendered (used only for UI)
Assembly version of this dank MiniProfiler.
The provider used to provider the current instance of a provider
This is also
A function that determines who can access the MiniProfiler results url and list url. It should return true when
the request client has access to results, false for a 401 to be returned. HttpRequest parameter is the current request and
The HttpRequest parameter that will be passed into this function should never be null.
Special authorization function that is called for the list results (listing all the profiling sessions),
we also test for results authorize always. This must be set and return true, to enable the listing feature.
Allows switching out stopwatches for unit testing.
Categorizes individual steps to allow filtering.
Default level given to Timings.
Useful when profiling many items in a loop, but you don't wish to always see this detail.
Dictates on which side of the page the profiler popup button is displayed; defaults to left.
Profiler popup button is displayed on the left.
Profiler popup button is displayed on the right.
Contains helper methods that ease working with null s.
Wraps in a call and executes it, returning its result.
The current profiling session or null.
Method to execute and profile.
The step name used to label the profiler results.
Returns an that will time the code between its creation and disposal.
The current profiling session or null.
A descriptive name for the code that is encapsulated by the resulting IDisposable's lifetime.
This step's visibility level; allows filtering when is called.
Adds 's hierarchy to this profiler's current Timing step,
allowing other threads, remote calls, etc. to be profiled and joined into this profiling session.
Returns an html-encoded string with a text-representation of ; returns "" when profiler is null.
The current profiling session or null.
Wraps a database connection, allowing sql execution timings to be collected when a session is started.
This will be made private; use
This will be made private; use
Returns a new that wraps ,
providing query execution profiling. If profiler is null, no profiling will occur.
Your provider-specific flavor of connection, e.g. SqlConnection, OracleConnection
The currently started or null.
The underlying, real database connection to your db provider.
The current profiler instance; could be null.
The raw connection this is wrapping
Times collected from the client
Returns null if there is not client timing stuff
Stores information about client perf
List of client side timings
A client timing probe
Formats SQL server queries with a DECLARE up top for parameter values
Formats the SQL in a SQL-Server friendly way, with DECLARE statements for the parameters up top.
The SqlTiming to format
A formatted SQL string
Gets part of a stack trace containing only methods we care about.
Gets the current formatted and filted stack trace.
Space separated list of methods
Identifies users based on ip address.
Returns the paramter HttpRequest's client ip address.
Categories of sql statements.
Unknown
DML statements that alter database state, e.g. INSERT, UPDATE
Statements that return a single record
Statements that iterate over a result set
You can wrap your view engines with this view to enable profiling on views and partial
Wrap your view engines with this to allow profiling
Find a partial
Find a view
Find a partial
Contains helper code to time sql statements.
Returns a new SqlProfiler to be used in the 'profiler' session.
Tracks when 'command' is started.
Returns all currently open commands on this connection
Finishes profiling for 'command', recording durations.
Called when 'reader' finishes its iterations and is closed.
The profiling session this SqlProfiler is part of.
Helper methods that allow operation on SqlProfilers, regardless of their instantiation.
Tracks when 'command' is started.
Finishes profiling for 'command', recording durations.
Called when 'reader' finishes its iterations and is closed.
This filter can be applied globally to hook up automatic action profiling
Happens before the action starts running
Happens after the action executes
If the underlying command supports BindByName, this sets/clears the underlying
implementation accordingly. This is required to support OracleCommand from dapper-dot-net
An individual profiling step that can contain child steps.
Rebuilds all the parent timings on deserialization calls
Offset from parent MiniProfiler's creation that this Timing was created.
Creates a new Timing named 'name' in the 'profiler's session, with 'parent' as this Timing's immediate ancestor.
Obsolete - used for serialization.
Returns this Timing's Name.
Returns true if Ids match.
Returns hashcode of Id.
Adds arbitrary string 'value' under 'key', allowing custom properties to be stored in this Timing step.
Completes this Timing's duration and sets the MiniProfiler's Head up one level.
Add the parameter 'timing' to this Timing's Children collection.
Used outside this assembly for custom deserialization when creating an implementation.
Adds the parameter 'sqlTiming' to this Timing's SqlTimings collection.
A sql statement profiling that was executed in this Timing step.
Used outside this assembly for custom deserialization when creating an implementation.
Returns the number of sql statements of that were executed in this .
Unique identifer for this timing; set during construction.
Text displayed when this Timing is rendered.
How long this Timing step took in ms; includes any Timings' durations.
The offset from the start of profiling.
All sub-steps that occur within this Timing step. Add new children through
Stores arbitrary key/value strings on this Timing step. Add new tuples through .
Any queries that occurred during this Timing step.
Needed for database deserialization and JSON serialization.
Which Timing this Timing is under - the duration that this step takes will be added to its parent's duration.
This will be null for the root (initial) Timing.
Gets the elapsed milliseconds in this step without any children's durations.
Gets the aggregate elapsed milliseconds of all SqlTimings executed in this Timing, excluding Children Timings.
Returns true when this is less than the configured
, by default 2.0 ms.
Reference to the containing profiler, allowing this Timing to affect the Head and get Stopwatch readings.
Returns true when this Timing has inner Timing steps.
Returns true if this Timing step collected sql execution timings.
Returns true if any s executed in this step are detected as duplicate statements.
Returns true when this Timing is the first one created in a MiniProfiler session.
How far away this Timing is from the Profiler's Root.
How many sql data readers were executed in this Timing step. Does not include queries in any child Timings.
How many sql scalar queries were executed in this Timing step. Does not include queries in any child Timings.
How many sql non-query statements were executed in this Timing step. Does not include queries in any child Timings.
Understands how to store a to the with absolute expiration.
The string that prefixes all keys that MiniProfilers are saved under, e.g.
"mini-profiler-ecfb0050-7ce8-4bf1-bf82-2cb38e90e31e".
Returns a new HttpRuntimeCacheStorage class that will cache MiniProfilers for the specified duration.
Saves to the HttpRuntime.Cache under a key concated with
and the parameter's .
remembers we did not view the profile
Set the profile to viewed for this user
Returns the saved identified by . Also marks the resulting
profiler to true.
Returns a list of s that haven't been seen by .
User identified by the current .
Syncs access to runtime cache when adding a new list of ids for a user.
How long to cache each for (i.e. the absolute expiration parameter of
)