├── Binary └── SQLServerDashboard.zip ├── Docs ├── BlockOnDB.png ├── Dashboard-600.png ├── Dashboard-800.png ├── Dashboard.png ├── DatabaseFiles.png ├── ExpensiveStoredProc.png ├── Graphs.png ├── MostExpensiveQueries.png ├── PerformanceCounters.png ├── QueryDetailView.png ├── Sessions.png ├── WhatsGoingOn.png └── web.config ├── README.md └── Source ├── SQLServerDashboard.sln ├── SQLServerDashboard.v12.suo ├── SQLServerDashboard ├── Blocks.aspx ├── CPU.ashx ├── CPU.ashx.cs ├── CPUTab.aspx ├── CurrentSessions.aspx ├── CurrentSessions.aspx.cs ├── CurrentSessions.aspx.designer.cs ├── Dashboard.aspx ├── DatabaseFiles.aspx ├── Default.aspx ├── ExpensiveQueries.aspx ├── ExpensiveStoredProc.aspx ├── HistoryTab.aspx ├── InactiveSessions.aspx ├── PerformanceCounters.aspx ├── Processes.aspx ├── Properties │ └── AssemblyInfo.cs ├── SQLServerDashboard.csproj ├── SQLServerDashboard.csproj.user ├── Scripts │ ├── jquery-1.7.1.intellisense.js │ ├── jquery-1.7.1.js │ └── jquery-1.7.1.min.js ├── Sessions.aspx ├── SessionsTab.aspx ├── Summary.aspx ├── TestFlot.html ├── Todo.txt ├── WaitsTab.aspx ├── Web.Debug.config ├── Web.Release.config ├── Web.config ├── WhoIsActive.aspx ├── bin │ ├── SQLServerDashboard.dll │ └── SQLServerDashboard.pdb ├── cpu.aspx ├── css │ ├── basic.css │ ├── basic_ie.css │ ├── bootstrap-theme.css │ ├── bootstrap-theme.css.map │ ├── bootstrap-theme.min.css │ ├── bootstrap.css │ ├── bootstrap.css.map │ ├── bootstrap.min.css │ └── dashboard.css ├── fonts │ ├── glyphicons-halflings-regular.eot │ ├── glyphicons-halflings-regular.svg │ ├── glyphicons-halflings-regular.ttf │ └── glyphicons-halflings-regular.woff ├── idle.html ├── img │ └── basic │ │ └── x.png └── js │ ├── Dashboard.js │ ├── ScriptsForWidgets.js │ ├── bootstrap.js │ ├── bootstrap.min.js │ ├── jquery-1.11.1.min.js │ ├── jquery.fixedheadertable.min.js │ ├── jquery.flot.baseline.js │ ├── jquery.flot.js │ ├── jquery.flot.time.min.js │ ├── jquery.idletimer.js │ └── jquery.simplemodal.js ├── deploy.ps1 └── gitpush.ps1 /Binary/SQLServerDashboard.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oazabir/SQLServerPerformanceDashboard/3847e8003f266d5ebb0926d585d5cb7f8adce0a6/Binary/SQLServerDashboard.zip -------------------------------------------------------------------------------- /Docs/BlockOnDB.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oazabir/SQLServerPerformanceDashboard/3847e8003f266d5ebb0926d585d5cb7f8adce0a6/Docs/BlockOnDB.png -------------------------------------------------------------------------------- /Docs/Dashboard-600.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oazabir/SQLServerPerformanceDashboard/3847e8003f266d5ebb0926d585d5cb7f8adce0a6/Docs/Dashboard-600.png -------------------------------------------------------------------------------- /Docs/Dashboard-800.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oazabir/SQLServerPerformanceDashboard/3847e8003f266d5ebb0926d585d5cb7f8adce0a6/Docs/Dashboard-800.png -------------------------------------------------------------------------------- /Docs/Dashboard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oazabir/SQLServerPerformanceDashboard/3847e8003f266d5ebb0926d585d5cb7f8adce0a6/Docs/Dashboard.png -------------------------------------------------------------------------------- /Docs/DatabaseFiles.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oazabir/SQLServerPerformanceDashboard/3847e8003f266d5ebb0926d585d5cb7f8adce0a6/Docs/DatabaseFiles.png -------------------------------------------------------------------------------- /Docs/ExpensiveStoredProc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oazabir/SQLServerPerformanceDashboard/3847e8003f266d5ebb0926d585d5cb7f8adce0a6/Docs/ExpensiveStoredProc.png -------------------------------------------------------------------------------- /Docs/Graphs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oazabir/SQLServerPerformanceDashboard/3847e8003f266d5ebb0926d585d5cb7f8adce0a6/Docs/Graphs.png -------------------------------------------------------------------------------- /Docs/MostExpensiveQueries.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oazabir/SQLServerPerformanceDashboard/3847e8003f266d5ebb0926d585d5cb7f8adce0a6/Docs/MostExpensiveQueries.png -------------------------------------------------------------------------------- /Docs/PerformanceCounters.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oazabir/SQLServerPerformanceDashboard/3847e8003f266d5ebb0926d585d5cb7f8adce0a6/Docs/PerformanceCounters.png -------------------------------------------------------------------------------- /Docs/QueryDetailView.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oazabir/SQLServerPerformanceDashboard/3847e8003f266d5ebb0926d585d5cb7f8adce0a6/Docs/QueryDetailView.png -------------------------------------------------------------------------------- /Docs/Sessions.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oazabir/SQLServerPerformanceDashboard/3847e8003f266d5ebb0926d585d5cb7f8adce0a6/Docs/Sessions.png -------------------------------------------------------------------------------- /Docs/WhatsGoingOn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oazabir/SQLServerPerformanceDashboard/3847e8003f266d5ebb0926d585d5cb7f8adce0a6/Docs/WhatsGoingOn.png -------------------------------------------------------------------------------- /Docs/web.config: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oazabir/SQLServerPerformanceDashboard/3847e8003f266d5ebb0926d585d5cb7f8adce0a6/Docs/web.config -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | SQL Server Performance Dashboard (SSPD) 2 | ======================================= 3 | 4 | ## Introduction 5 | SQL Server Performance Dashboard (SSPD) is a small website that shows you performance & problems of one or more SQL Server instances and their databases in near real time. It uses the Dynamic Management Views (DMV) to gather useful data from the verbose output and combines them with utility stored procs in order to get meaningful, easy to understand information out of them. You can use it to quickly spot blocking queries, who is blocking who, expensive query that are consuming high CPU or disk, see if there's unusual locks, very high disk activity and so on. 6 | 7 | ![enter image description here][1] 8 | 9 | ## Get the code 10 | The binaries are here, which you can just extract into a IIS folder, put the connection strings in the web.config file for a user that has elevated privilege, and you are done. 11 | [SqlServerDashboard GitHub Project Binaries][2] 12 | 13 | If you aren't using the sa user, but your own user, give the user the right permission: 14 | 15 | USE master; 16 | GO 17 | GRANT VIEW SERVER STATE TO MyUser; 18 | GO 19 | 20 | Here's a sample connection string: 21 | 22 | 23 | 24 | Or you can get the source code from the GitHub project site: 25 | [https://github.com/oazabir/SQLServerDashboard][3] 26 | 27 | ## Why not use SQL Server Management Studio? 28 | SQL Server Management Studio comes with Activity Report that shows real time performance of the server, as well as various reports to show you top queries, blocked sessions etc. Those are quite useful surely, but what we need is someone telling us exactly what is wrong with the query or what is wrong with a particular WAIT or what is really wrong with some graph that looks high. For ex, on the Top IO query report, it would be useful to know what part of the query is causing high IO. Is there a table scan? Index scan? Similarly, on the blocked session report, it would be useful to know who is blocking who. SSPD tries to make it painless for us by telling us exactly what is wrong. Moreover, it is available as a website, readily available without having to launch SQL Server Management Studio and running the reports. Also SSPD refreshes real time, showing you the latest state of the server every 5-10 seconds. 29 | 30 | ## What's happening on the server now? 31 | SSPD uses some custom made scripts to query the DMVs and then make sense out of it. For ex, let's look at the first one: "What's going on." It shows you near real-time view of what queries are running at this moment, and it will also tell you what is really bad about the queries: 32 | 33 | ![What's going on][4] 34 | 35 | It uses the famous [Who is Active][5] script made by Adam Machanic, that gives a very informative view of what is currently happening on the server. 36 | 37 | Once it pulls the output, it binds to a `DataGrid` and for each row, and then it checks if there's something off the chart: 38 | 39 | 40 | 41 | 42 | 43 | <%# Convert.ToDecimal(Eval("CPU")) > 1000 ? "High CPU" : "" %> 44 | <%# Convert.ToDecimal(Eval("physical_reads")) > 1000 ? "High Physical Read" : "" %> 45 | 46 | 47 | 48 | 49 | No Query running at the moment. 50 | 51 | 52 | 53 | Here you see, it looks at specific values and if the values are unusually high, it injects a warning label. This saves you from scanning through the output to see if something is off. You can easily set the threshold values you want and get instant warning labels on the screen. 54 | 55 | Wherever you see a query, you can click on it to view the full details. 56 | 57 | ![Full query view][6] 58 | 59 | ## Most expensive queries 60 | This is probably the most useful one for day to day monitoring. It queries the cached plan for the queries SQL Server has run since it was last restarted or `DBCC FREEPROCCACHE` was called. Then it shows you not just the most expensive query, but also exactly what part of the query is causing the problem. You can see the WHERE clause that is causing the highest IO load. 61 | 62 | ![Most expensive queries][7] 63 | 64 | Here you can see some table scan going on. You can also see the part of the WHERE clause that is causing the table scan. 65 | If you click on the query (scrolling right), it will show the full query. 66 | 67 | ## Expensive stored proc 68 | Next one is the Expensive Stored Proc view, which shows you the most expensive stored procs in terms of CPU or IO. 69 | 70 | ![Expensive Stored Proc][8] 71 | 72 | You can see here the `AvgLogicalReads` for `QueryOrders` is very high. That stored proc is killing the database. 73 | 74 | ## How it works 75 | ### Look ma, no AJAX! 76 | You will notice that the panels are refreshing periodically. You might think I am using AJAX to call some serverside web service in order to get JSON/XML response, and then use some jQuery template to render the html output. Nope. I am using what our ancestors have happily used for generations. The natural, organic IFRAME solution, with no side effect. The html output for each panel comes from individual ASP.NET pages, via IFRAMEs and then they get injected into a DIV on the main Dashboard page. 77 | 78 | There are several benefits to this approach: 79 | 80 | - The widgets are individual pages, which user can browse directly in full browser view. 81 | - Each widget is a plain ASP.NET page. No need to build webservices to return data in JSON/XML format. No need for any entity classes either that you usually use to serialize into JSON/XML. 82 | - The HTML content is generated server side, using regular ASP.NET. Thus there's no need to use any Javascript based HTML templating library. 83 | - As there's no need for AJAX or html templating, there's no need to worry about jQuery or its plugin breaking compatibility in new versions, and updating javascript libraries regularly. 84 | 85 | Let's see how to do this. First the HTML markup to draw the panels: 86 | 87 |
88 |
89 | 90 |
91 |
92 |
100% Complete
93 |
94 |
95 | 96 |
97 |
98 | 99 | This is the markup taken from the [Twitter Bootstrap theme][9]. 100 | 101 | You will notice there's an invisible IFRAME there. When the IFRAME loads, it calls the `setContent` function. That function takes the whole content of the IFRAME and injects inside the panel-body div. 102 | 103 | function setContent(iframe, id) { 104 | ... 105 | $('#' + id) 106 | .html($(iframe).contents().find("form").html()) 107 | .dblclick(function () { 108 | iframe.contentWindow.location.reload(); 109 | }) 110 | ... 111 | } 112 | 113 | There you go, clean AJAX-like solution without any AJAX: no XMLHTTP, no JSON plumbing, no HTML templating, no server-side webservice. 114 | 115 | Now this would not work for any event handler that is hooked inside the IFRAME. So, how does the click on a query show the popup window with the full query? Also if it was an IFRAME, shouldn't the popup actually come inside the IFRAME? 116 | 117 | The click functionality is done on the main Dashboard page. After injecting the content into the DIV, it hooks the click handlers that shows the popup on the main page: 118 | 119 | function setContent(iframe, id) { 120 | $('#' + id) 121 | .find('td.large-cell').off('click'); 122 | 123 | if ($('#' + id).scrollLeft() == 0) { 124 | $('#' + id) 125 | .html($(iframe).contents().find("form").html()) 126 | .dblclick(function () { 127 | iframe.contentWindow.location.reload(); 128 | }) 129 | .find('td.large-cell').find('div').click(function () { 130 | $('#content_text').text($(this).html()); 131 | $('#basic-modal-content').modal(); 132 | }); 133 | } 134 | 135 | Here's it looks for any having the class large-cell. It then hooks the click even on it and shows the modal dialog box. The modal dialog box is from [Eric Martin's SimpleModal][10] plugin. 136 | 137 | ### Plotting the charts 138 | The chart uses the jQuery plugin [Flot][11] to render some of the performance counters as running charts. 139 | 140 | ![Flot charts][12] 141 | 142 | There's a PerformanceCounter.aspx which is responsible for rendering the table showing the performance counters. It picks some important counters, and marks them to appear on the chart. First it runs through the table, looking for the counters, and marks the label of the counter as x-axis and value of the counter as y-axis: 143 | 144 | var plot = ["Batch Requests/sec", "Full Scans/sec", "SQL Compilations/sec", "Total Latch Wait Time (ms)"]; 145 | $('td').each(function (i, e) { 146 | td = $(e); 147 | if (td.text().trim().length > 0) { 148 | for (var i = 0; i < plot.length; i ++) { 149 | if (plot[i] == td.text().trim()) { 150 | if (td.prev().text() == "_Total" || td.prev().text().trim().length == 0) { 151 | td.addClass("x-axis"); 152 | td.next().addClass("y-axis"); 153 | } 154 | } 155 | } 156 | } 157 | }) 158 | 159 | Now this page is hosted on the Dashboard page inside an IFRAME. So, the Dashboard page scans the IFRAME content, looks for these labels, picks their values and passes to the Flot chart plugin: 160 | 161 | $(iframe).contents().find("form").find(".x-axis").each(function (i, e) { 162 | var x = $(e); 163 | var y = x.next('.y-axis'); 164 | var xname = x.text(); 165 | var yvalue = parseInt(y.text()); 166 | if (datasets[xname]) { 167 | var data = datasets[xname].data; 168 | 169 | data.pop(); 170 | 171 | data.splice(0, 0, yvalue); 172 | } 173 | }); 174 | 175 | Rest of the job of updating the Flot chart is done by the usual Flot code: 176 | 177 | function updatePlot() { 178 | var index = 0; 179 | 180 | $.each(datasets, function (key, val) { 181 | var items = []; 182 | for (var i = 0; i < val.data.length; i++) 183 | items.push([i, val.data[i]]); 184 | 185 | var data = { color: val.color, data: items }; 186 | 187 | if (plots[index] != null) { 188 | plot = plots[index]; 189 | plot.setData([data]); 190 | plot.draw(); 191 | } 192 | else { 193 | plot = $.plot("#placeholder" + (index + 1), [data], { 194 | series: { 195 | //shadowSize: 0 // Drawing is faster without shadows 196 | }, 197 | lines: { show: true, fill: true }, 198 | grid: { 199 | hoverable: true, 200 | clickable: true 201 | }, 202 | yaxis: { 203 | min: 0, 204 | max: val.ymax 205 | }, 206 | xaxis: { 207 | show: false 208 | } 209 | }); 210 | 211 | That's it! Again, no AJAX, no webservice, no html templating, no JSON plubing. Pure organic IFRAME and html. 212 | 213 | ## Conclusion 214 | SSPD tries to make it easy for us to monitor SQL Server health. It gives meainingful information out of the verbose data produced by SQL Server's built-in views. It shows you exactly where the problem is. You can customize the code anyway you like, adding your own warnings, own thresholds, and make it suit your specific need. 215 | 216 | [1]: https://raw.githubusercontent.com/oazabir/SQLServerPerformanceDashboard/master/Docs/Dashboard-800.png 217 | [2]: https://github.com/oazabir/SQLServerPerformanceDashboard/blob/master/Binary/SQLServerDashboard.zip?raw=true 218 | [3]: https://github.com/oazabir/SQLServerPerformanceDashboard 219 | [4]: https://raw.githubusercontent.com/oazabir/SQLServerPerformanceDashboard/master/Docs/WhatsGoingOn.png 220 | [5]: http://sqlblog.com/blogs/adam_machanic/archive/2012/03/22/released-who-is-active-v11-11.aspx 221 | [6]: https://raw.githubusercontent.com/oazabir/SQLServerPerformanceDashboard/master/Docs/QueryDetailView.png 222 | [7]: https://raw.githubusercontent.com/oazabir/SQLServerPerformanceDashboard/master/Docs/MostExpensiveQueries.png 223 | [8]: https://raw.githubusercontent.com/oazabir/SQLServerPerformanceDashboard/master/Docs/ExpensiveStoredProc.png 224 | [9]: http://getbootstrap.com/examples/theme/ 225 | [10]: http://www.ericmmartin.com/projects/simplemodal/ 226 | [11]: http://www.flotcharts.org/ 227 | [12]: https://raw.githubusercontent.com/oazabir/SQLServerPerformanceDashboard/master/Docs/Graphs.png 228 | -------------------------------------------------------------------------------- /Source/SQLServerDashboard.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio 2013 4 | VisualStudioVersion = 12.0.21005.1 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SQLServerDashboard", "SQLServerDashboard\SQLServerDashboard.csproj", "{7E284626-B72E-4C57-8063-7F8B3B35B4BD}" 7 | EndProject 8 | Global 9 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 10 | Debug|Any CPU = Debug|Any CPU 11 | Release|Any CPU = Release|Any CPU 12 | EndGlobalSection 13 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 14 | {7E284626-B72E-4C57-8063-7F8B3B35B4BD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 15 | {7E284626-B72E-4C57-8063-7F8B3B35B4BD}.Debug|Any CPU.Build.0 = Debug|Any CPU 16 | {7E284626-B72E-4C57-8063-7F8B3B35B4BD}.Release|Any CPU.ActiveCfg = Release|Any CPU 17 | {7E284626-B72E-4C57-8063-7F8B3B35B4BD}.Release|Any CPU.Build.0 = Release|Any CPU 18 | EndGlobalSection 19 | GlobalSection(SolutionProperties) = preSolution 20 | HideSolutionNode = FALSE 21 | EndGlobalSection 22 | EndGlobal 23 | -------------------------------------------------------------------------------- /Source/SQLServerDashboard.v12.suo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oazabir/SQLServerPerformanceDashboard/3847e8003f266d5ebb0926d585d5cb7f8adce0a6/Source/SQLServerDashboard.v12.suo -------------------------------------------------------------------------------- /Source/SQLServerDashboard/Blocks.aspx: -------------------------------------------------------------------------------- 1 | <%@ Page Language="C#" EnableViewState="false"%> 2 | <%@ OutputCache NoStore="true" Location="None" %> 3 | 4 | 5 | 6 | 7 | 8 | Sessions 9 | 10 | 11 | 12 | 13 | 14 |
15 | 46 | 47 | 48 | No blocking session 49 | 50 | 51 |
52 | 53 | 73 | 79 | 80 | -------------------------------------------------------------------------------- /Source/SQLServerDashboard/CPU.ashx: -------------------------------------------------------------------------------- 1 | <%@ WebHandler Language="C#" CodeBehind="CPU.ashx.cs" Class="SQLServerDashboard.CPU" %> 2 | -------------------------------------------------------------------------------- /Source/SQLServerDashboard/CPU.ashx.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Configuration; 4 | using System.Data.SqlClient; 5 | using System.Text; 6 | using System.Web; 7 | 8 | namespace SQLServerDashboard 9 | { 10 | /// 11 | /// Summary description for CPU 12 | /// 13 | public class CPU : IHttpHandler 14 | { 15 | 16 | public void ProcessRequest(HttpContext context) 17 | { 18 | string connectionName = context.Request["c"]; 19 | using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings[connectionName].ConnectionString)) 20 | { 21 | conn.Open(); 22 | using (SqlCommand cmd = new SqlCommand()) 23 | { 24 | cmd.Connection = conn; 25 | cmd.CommandText = @" 26 | declare @ts_now bigint 27 | select @ts_now = ms_ticks from sys.dm_os_sys_info 28 | 29 | select top 30 record_id, 30 | dateadd (ms, (y.[timestamp] -@ts_now), GETDATE()) as EventTime, 31 | SQLProcessUtilization as SQLServer, 32 | --SystemIdle, 33 | 100 - SystemIdle - SQLProcessUtilization as Others 34 | from ( 35 | select 36 | record.value('(./Record/@id)[1]', 'int') as record_id, 37 | record.value('(./Record/SchedulerMonitorEvent/SystemHealth/SystemIdle)[1]', 'int') 38 | as SystemIdle, 39 | record.value('(./Record/SchedulerMonitorEvent/SystemHealth/ProcessUtilization)[1]', 40 | 'int') as SQLProcessUtilization, 41 | timestamp 42 | from ( 43 | select timestamp, convert(xml, record) as record 44 | from sys.dm_os_ring_buffers 45 | where ring_buffer_type = N'RING_BUFFER_SCHEDULER_MONITOR' 46 | and record like '%%') as x 47 | ) as y 48 | order by record_id desc 49 | 50 | "; 51 | cmd.CommandType = System.Data.CommandType.Text; 52 | 53 | StringBuilder buf = new StringBuilder(); 54 | //using (OracleDataReader dr = cmd.ExecuteReader()) 55 | // WriteDataReader(buf, dr); 56 | using (SqlDataReader dr1 = cmd.ExecuteReader()) 57 | { 58 | buf.Append("(["); 59 | while (dr1.Read()) 60 | { 61 | double sqlServer = Convert.ToDouble(dr1["SQLServer"]); 62 | double others = Convert.ToDouble(dr1["Others"]); 63 | double total = sqlServer + others; 64 | buf.Append(string.Format( 65 | "{{'Total time':{0}, 'SQLServer': {1}, 'Others': {2}, 'EventTime': {3}}},", 66 | Convert.ToString(total), 67 | Convert.ToString(sqlServer), 68 | Convert.ToString(others), 69 | Convert.ToDateTime(dr1["EventTime"]).Ticks/10000)); 70 | } 71 | if (buf[buf.Length - 1] == ',') 72 | buf.Remove(buf.Length - 1, 1); 73 | buf.Append("])"); 74 | } 75 | 76 | context.Response.ContentType = "application/json"; 77 | context.Response.Write(buf.ToString()); 78 | } 79 | } 80 | 81 | } 82 | 83 | public bool IsReusable 84 | { 85 | get 86 | { 87 | return false; 88 | } 89 | } 90 | } 91 | } -------------------------------------------------------------------------------- /Source/SQLServerDashboard/CPUTab.aspx: -------------------------------------------------------------------------------- 1 | <%@ Page Language="C#" %> 2 | 3 | <%@ OutputCache NoStore="true" Location="None" %> 4 | 5 | 6 | 7 | 8 | 9 | 10 | CPU Monitor 11 | 12 | 13 | 14 | 15 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 29 | 57 | 58 | 59 |
60 | 61 |
62 |
63 |
64 |
Batch Requests/sec
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
Full Scans/sec
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
SQL Compilations/sec
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
Total Latch Wait Time (ms)
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 | 104 | 105 |
106 |
107 | 108 |
109 |
110 |
100% Complete
111 |
112 |
113 | 114 |
115 |
116 | 117 |
118 |
119 | 120 |
121 |
122 |
100% Complete
123 |
124 |
125 | 126 |
127 |
128 | 129 | 130 |
131 |
132 |
133 | 134 |
135 |
136 |
100% Complete
137 |
138 |
139 | 140 |
141 |
142 |
143 |
144 | 145 |
146 |
147 | 
148 |         
149 |
150 | 151 | 160 | 161 | 162 | 163 | 164 | 165 | -------------------------------------------------------------------------------- /Source/SQLServerDashboard/CurrentSessions.aspx: -------------------------------------------------------------------------------- 1 | <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="CurrentSessions.aspx.cs" Inherits="SQLServerDashboard.CurrentSessions" %> 2 | <%@ OutputCache NoStore="true" Location="None" %> 3 | 4 | 5 | 6 | 7 | 8 | Sessions 9 | 10 | 11 | 12 | 13 | 14 |
15 | 86 | 87 | 88 | No session running at the moment. 89 | 90 | 91 | 92 | 93 | <%# Convert.ToInt32(Eval("CPU_TIME")) > 3000 ? "High CPU" : "" %> 94 | <%# Convert.ToInt32(Eval("Blocker")) > 0 ? "Blocking" : "" %> 95 | 96 | 97 | 98 | 99 |
100 | 101 | 128 | 134 | 135 | -------------------------------------------------------------------------------- /Source/SQLServerDashboard/CurrentSessions.aspx.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | 4 | using System.Web; 5 | using System.Web.UI; 6 | using System.Web.UI.WebControls; 7 | 8 | namespace SQLServerDashboard 9 | { 10 | public partial class CurrentSessions : System.Web.UI.Page 11 | { 12 | protected void Page_Load(object sender, EventArgs e) 13 | { 14 | 15 | } 16 | } 17 | } -------------------------------------------------------------------------------- /Source/SQLServerDashboard/CurrentSessions.aspx.designer.cs: -------------------------------------------------------------------------------- 1 | //------------------------------------------------------------------------------ 2 | // 3 | // This code was generated by a tool. 4 | // 5 | // Changes to this file may cause incorrect behavior and will be lost if 6 | // the code is regenerated. 7 | // 8 | //------------------------------------------------------------------------------ 9 | 10 | namespace SQLServerDashboard { 11 | 12 | 13 | public partial class CurrentSessions { 14 | 15 | /// 16 | /// form1 control. 17 | /// 18 | /// 19 | /// Auto-generated field. 20 | /// To modify move field declaration from designer file to code-behind file. 21 | /// 22 | protected global::System.Web.UI.HtmlControls.HtmlForm form1; 23 | 24 | /// 25 | /// sqlDataSource control. 26 | /// 27 | /// 28 | /// Auto-generated field. 29 | /// To modify move field declaration from designer file to code-behind file. 30 | /// 31 | protected global::System.Web.UI.WebControls.SqlDataSource sqlDataSource; 32 | 33 | /// 34 | /// GridView1 control. 35 | /// 36 | /// 37 | /// Auto-generated field. 38 | /// To modify move field declaration from designer file to code-behind file. 39 | /// 40 | protected global::System.Web.UI.WebControls.GridView GridView1; 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /Source/SQLServerDashboard/Dashboard.aspx: -------------------------------------------------------------------------------- 1 | <%@ Page Language="C#" %> 2 | 3 | <%@ OutputCache NoStore="true" Location="None" %> 4 | 5 | 6 | 7 | 8 | 9 | 10 | Oracle Health Monitor 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 42 | 43 |
44 |

<%= ConnectionString %>

45 | 46 | 51 |
52 | 53 | 54 | 55 | 56 |
57 | 58 |
59 |
60 | 61 |
62 |
 63 | 
 64 |         
65 |
66 | 67 | 104 | 105 | 119 | 120 | 121 | 122 | 123 | 124 | -------------------------------------------------------------------------------- /Source/SQLServerDashboard/DatabaseFiles.aspx: -------------------------------------------------------------------------------- 1 | <%@ Page Language="C#" AutoEventWireup="true" EnableViewState="false" %> 2 | <%@ OutputCache NoStore="true" Location="None" %> 3 | 4 | 5 | 6 | 7 | 8 | Sessions 9 | 10 | 11 | 12 | 13 |
14 | 84 | 85 | 86 | 87 | 88 | <%# Convert.ToInt32(Eval("io_ms")) > 1000 ? "High IO delay" : "" %> 89 | 90 | 91 | 92 | 93 |
94 | 95 | 102 | 108 | 109 | -------------------------------------------------------------------------------- /Source/SQLServerDashboard/Default.aspx: -------------------------------------------------------------------------------- 1 | <%@ Page Language="C#" %> 2 | <%@ OutputCache NoStore="true" Location="None" %> 3 | 4 | 5 | 6 | 7 | 8 | 9 | SQL Server Health Monitor 10 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 44 | 45 |
46 | 47 | 48 |
49 |
50 |
51 |

52 | "><%# Eval("Name") %> 53 |

54 |
55 |
56 | 57 |
">
58 | 59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 | 67 |
68 |
69 | 
70 |         
71 |
72 | 73 | 87 | 88 | 89 | 90 | 91 | 92 | -------------------------------------------------------------------------------- /Source/SQLServerDashboard/ExpensiveQueries.aspx: -------------------------------------------------------------------------------- 1 | <%@ Page Language="C#" EnableViewState="false" %> 2 | <%@ OutputCache NoStore="true" Location="None" %> 3 | 4 | 5 | 6 | 7 | 8 | Expensive Queries 9 | 10 | 11 | 25 | 26 | 27 | 28 |
29 | 145 | 146 | 147 | 148 | 149 | <%--<%# Convert.ToInt32(Eval("Avg CPU Time")) > 5000 ? "High CPU" : "" %> 150 | <%# Convert.ToInt32(Eval("max_logical_reads")) > 5000 ? "High Logical Read" : "" %> 151 | <%# Convert.ToInt32(Eval("max_physical_reads")) > 1000 ? "High Physical Read" : "" %> 152 | <%# Convert.ToInt32(Eval("max_logical_writes")) > 5000 ? "High Logical Write" : "" %> 153 | --%> 154 | 155 | 156 | 157 | 158 | No data found. 159 | 160 | 161 | 162 |
163 | 164 | 165 | 177 | 183 | 184 | -------------------------------------------------------------------------------- /Source/SQLServerDashboard/ExpensiveStoredProc.aspx: -------------------------------------------------------------------------------- 1 | <%@ Page Language="C#" EnableViewState="false" %> 2 | <%@ OutputCache NoStore="true" Location="None" %> 3 | 4 | 5 | 6 | 7 | 8 | 9 | Expensive Stored Proc 10 | 11 | 12 | 13 | 14 | 15 |
16 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 |
45 | 52 | 58 | 59 | 60 | 61 | -------------------------------------------------------------------------------- /Source/SQLServerDashboard/HistoryTab.aspx: -------------------------------------------------------------------------------- 1 | <%@ Page Language="C#" %> 2 | 3 | <%@ OutputCache NoStore="true" Location="None" %> 4 | 5 | 6 | 7 | 8 | 9 | 10 | CPU Monitor 11 | 12 | 13 | 14 | 15 | 18 | 19 | 20 | 21 | 22 | 27 | 28 | 29 |
30 |
31 |
32 |
33 | 34 |
35 |
36 |
100% Complete
37 |
38 |
39 | 40 |
41 |
42 |
43 |
44 | 45 |
46 |
47 |
100% Complete
48 |
49 |
50 | 51 |
52 |
53 |
54 | 55 |
56 |
57 |
58 | 59 |
60 |
61 |
100% Complete
62 |
63 |
64 | 65 |
66 |
67 | 68 |
69 |
70 | 71 |
72 | 73 |
74 | 75 |
76 |
77 |
78 |
79 | 80 |
81 |
 82 | 
 83 |         
84 |
85 | 86 | 95 | 96 | 97 | 98 | 99 | 100 | -------------------------------------------------------------------------------- /Source/SQLServerDashboard/InactiveSessions.aspx: -------------------------------------------------------------------------------- 1 | <%@ Page Language="C#" EnableViewState="false" %> 2 | <%@ OutputCache NoStore="true" Location="None" %> 3 | 4 | 5 | 6 | 7 | 8 | 9 | Inactive Sessions 10 | 11 | 12 |
13 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | No inactive sessions older than 1 day. 54 | 55 | 56 |
57 | 58 | 64 | 65 | -------------------------------------------------------------------------------- /Source/SQLServerDashboard/PerformanceCounters.aspx: -------------------------------------------------------------------------------- 1 | <%@ Page Language="C#" EnableViewState="false" %> 2 | <%@ OutputCache NoStore="true" Location="None" %> 3 | 4 | 5 | 6 | 7 | 8 | 9 | Sessions 10 | 11 | 12 | 13 | 14 |
15 | 118 | 122 | 123 | 124 | 125 | 126 | <%# Convert.ToString(Eval("counter_name")).Trim() == "Errors/sec" && Convert.ToSingle(Eval("cntr_value")) > 1 ? "High Errors/Sec" : "" %> 127 | <%# Convert.ToString(Eval("counter_name")).Trim() == "Lock Waits/sec" && Convert.ToSingle(Eval("cntr_value")) > 1 ? "Lock Waits/sec" : "" %> 128 | <%# Convert.ToString(Eval("counter_name")).Trim() == "Total Latch Wait Time (ms)" && Convert.ToSingle(Eval("cntr_value")) > 1000 ? "High Total Latch Wait" : "" %> 129 | 130 | 131 | 132 | 133 | 134 |
135 | 136 | 137 | 168 | 174 | 175 | -------------------------------------------------------------------------------- /Source/SQLServerDashboard/Processes.aspx: -------------------------------------------------------------------------------- 1 | <%@ Page Language="C#" EnableViewState="false" %> 2 | <%@ OutputCache NoStore="true" Location="None" %> 3 | 4 | 5 | 6 | 7 | 8 | 9 | Processes 10 | 11 | 12 | 13 | 14 | 15 | 16 | 30 | 31 | 32 |
33 | 127 | 128 | 129 | 130 | 131 | 132 | <%# Convert.ToString(Eval("BlockBy")).Length > 1 ? "Block" : "" %> 133 | 134 | 135 | 136 | 137 |
138 | 139 |
140 |
141 | 
142 |         
143 |
144 | 145 | 160 | 166 | 167 | -------------------------------------------------------------------------------- /Source/SQLServerDashboard/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | using System.Runtime.InteropServices; 4 | 5 | // General Information about an assembly is controlled through the following 6 | // set of attributes. Change these attribute values to modify the information 7 | // associated with an assembly. 8 | [assembly: AssemblyTitle("SQLServerDashboard")] 9 | [assembly: AssemblyDescription("")] 10 | [assembly: AssemblyConfiguration("")] 11 | [assembly: AssemblyCompany("")] 12 | [assembly: AssemblyProduct("SQLServerDashboard")] 13 | [assembly: AssemblyCopyright("Copyright © 2014")] 14 | [assembly: AssemblyTrademark("")] 15 | [assembly: AssemblyCulture("")] 16 | 17 | // Setting ComVisible to false makes the types in this assembly not visible 18 | // to COM components. If you need to access a type in this assembly from 19 | // COM, set the ComVisible attribute to true on that type. 20 | [assembly: ComVisible(false)] 21 | 22 | // The following GUID is for the ID of the typelib if this project is exposed to COM 23 | [assembly: Guid("2ffeb9d9-c477-45ec-a0b6-66d647ea68d0")] 24 | 25 | // Version information for an assembly consists of the following four values: 26 | // 27 | // Major Version 28 | // Minor Version 29 | // Build Number 30 | // Revision 31 | // 32 | // You can specify all the values or you can default the Revision and Build Numbers 33 | // by using the '*' as shown below: 34 | [assembly: AssemblyVersion("1.0.0.0")] 35 | [assembly: AssemblyFileVersion("1.0.0.0")] 36 | -------------------------------------------------------------------------------- /Source/SQLServerDashboard/SQLServerDashboard.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | Debug 6 | AnyCPU 7 | 8 | 9 | 2.0 10 | {7E284626-B72E-4C57-8063-7F8B3B35B4BD} 11 | {349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc} 12 | Library 13 | Properties 14 | SQLServerDashboard 15 | SQLServerDashboard 16 | v2.0 17 | true 18 | 19 | 20 | 21 | 22 | 23 | 24 | true 25 | full 26 | false 27 | bin\ 28 | DEBUG;TRACE 29 | prompt 30 | 4 31 | 32 | 33 | pdbonly 34 | true 35 | bin\ 36 | TRACE 37 | prompt 38 | 4 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | CPU.ashx 100 | 101 | 102 | CurrentSessions.aspx 103 | ASPXCodeBehind 104 | 105 | 106 | CurrentSessions.aspx 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | Web.config 122 | 123 | 124 | Web.config 125 | 126 | 127 | 128 | 12.0 129 | $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | True 139 | True 140 | 57301 141 | / 142 | http://localhost:5000/ 143 | False 144 | False 145 | 146 | 147 | False 148 | 149 | 150 | 151 | 152 | 159 | -------------------------------------------------------------------------------- /Source/SQLServerDashboard/SQLServerDashboard.csproj.user: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | ShowAllFiles 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | CurrentPage 13 | True 14 | False 15 | False 16 | False 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | True 26 | True 27 | 28 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /Source/SQLServerDashboard/Sessions.aspx: -------------------------------------------------------------------------------- 1 | <%@ Page Language="C#" EnableViewState="false" %> 2 | <%@ OutputCache NoStore="true" Location="None" %> 3 | 4 | 5 | 6 | 7 | 8 | 9 | Sessions 10 | 11 | 12 | 13 | 14 |
15 | 20 | 21 | 22 | 23 | 24 | <%#Convert.ToInt32(Eval("Connections"))>Convert.ToInt32(ConfigurationManager.AppSettings["Warn above connection number"]) ? "High connections" : ""%> 25 | 26 | 27 | 28 | 29 |
30 | 31 | 38 | 44 | 45 | -------------------------------------------------------------------------------- /Source/SQLServerDashboard/SessionsTab.aspx: -------------------------------------------------------------------------------- 1 | <%@ Page Language="C#" %> 2 | <%@ OutputCache NoStore="true" Location="None" %> 3 | 4 | 5 | 6 | 7 | 8 | 9 | CPU Monitor 10 | 11 | 12 | 13 | 14 | 17 | 18 | 19 | 20 | 21 | 22 | 25 | 26 | 27 |
28 | 29 |
30 |
31 | 32 |
33 |
34 |
100% Complete
35 |
36 |
37 | 38 |
39 |
40 |
41 | 42 |
43 |
44 | 
45 |         
46 |
47 | 48 | 57 | 58 | 59 | 60 | 61 | 62 | -------------------------------------------------------------------------------- /Source/SQLServerDashboard/Summary.aspx: -------------------------------------------------------------------------------- 1 | <%@ Page Language="C#" EnableViewState="false"%> 2 | <%@ OutputCache NoStore="true" Location="None" %> 3 | 4 | 5 | 6 | 7 | 8 | Summary 9 | 10 | 11 | 12 | 17 | 18 | 19 |
20 | 153 | 154 | 155 |
156 | <%# Indicator(Convert.ToString(Eval("Name")), HandleDbNull(Eval("Value"))) %> 157 | <%# Eval("Name") %> 158 | <%# Eval("Value") %> 159 |
160 |
161 |
162 | <%-- 163 | 164 | No Summary data found. 165 | 166 | 167 | 168 | 169 | <%# Convert.ToString(Eval("Name")) == "CPU" && value) > 80 ? Warning(" ") : Success("") %> 170 | <%# Convert.ToString(Eval("Name")) == "Block" && value) > 0 ? Warning(" ") : Success("") %> 171 | <%# Convert.ToString(Eval("Name")) == "Locks" && value) > 0 ? Warning(" ") : Success("") %> 172 | <%# Convert.ToString(Eval("Name")) == "Long op" && value) > 0 ? Warning(" ") : Success("") %> 173 | <%# Convert.ToString(Eval("Name")) == "Space" && value) > 0 ? Warning(" ") : Success("") %> 174 | <%# Convert.ToString(Eval("Name")) == "Invalid Objects" && value) > 0 ? Warning(" ") : Success("") %> 175 | 176 | 177 | 178 | --%> 179 |
180 | 181 | 182 | 185 | 254 | 255 | -------------------------------------------------------------------------------- /Source/SQLServerDashboard/TestFlot.html: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 40 | 41 | 42 |

UTC

43 |
44 |
45 |
46 | 47 |

Browser

48 |
49 |
50 |
51 | 52 |

Chicago

53 |
54 |
55 |
56 | 57 |

Chicago

58 |
59 |
60 |
61 | 62 | 134 | 135 | 136 | 137 | -------------------------------------------------------------------------------- /Source/SQLServerDashboard/Todo.txt: -------------------------------------------------------------------------------- 1 | FIX: Summary.aspx: Write the query that will present correct summary 2 | -------------------------------------------------------------------------------- /Source/SQLServerDashboard/WaitsTab.aspx: -------------------------------------------------------------------------------- 1 | <%@ Page Language="C#" %> 2 | <%@ OutputCache NoStore="true" Location="None" %> 3 | 4 | 5 | 6 | 7 | 8 | 9 | CPU Monitor 10 | 11 | 12 | 13 | 14 | 17 | 18 | 19 | 20 | 21 | 24 | 25 | 26 |
27 | 28 |
29 | 30 |
31 |
32 | 33 |
34 |
35 |
100% Complete
36 |
37 |
38 | 39 |
40 |
41 | 42 |
43 |
44 | 45 |
46 |
47 |
100% Complete
48 |
49 |
50 | 51 |
52 |
53 |
54 | 55 |
56 | 57 |
58 |
59 | 60 |
61 |
62 |
100% Complete
63 |
64 |
65 | 66 |
67 |
68 | 69 |
70 |
71 | 72 |
73 |
74 |
100% Complete
75 |
76 |
77 | 78 |
79 |
80 |
81 | 82 |
83 | 84 |
85 |
 86 | 
 87 |         
88 |
89 | 90 | 99 | 100 | 101 | 102 | 103 | 104 | -------------------------------------------------------------------------------- /Source/SQLServerDashboard/Web.Debug.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 17 | 18 | 29 | 30 | -------------------------------------------------------------------------------- /Source/SQLServerDashboard/Web.Release.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 17 | 18 | 19 | 30 | 31 | -------------------------------------------------------------------------------- /Source/SQLServerDashboard/Web.config: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Source/SQLServerDashboard/bin/SQLServerDashboard.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oazabir/SQLServerPerformanceDashboard/3847e8003f266d5ebb0926d585d5cb7f8adce0a6/Source/SQLServerDashboard/bin/SQLServerDashboard.dll -------------------------------------------------------------------------------- /Source/SQLServerDashboard/bin/SQLServerDashboard.pdb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oazabir/SQLServerPerformanceDashboard/3847e8003f266d5ebb0926d585d5cb7f8adce0a6/Source/SQLServerDashboard/bin/SQLServerDashboard.pdb -------------------------------------------------------------------------------- /Source/SQLServerDashboard/cpu.aspx: -------------------------------------------------------------------------------- 1 | <%@ Page Language="C#" EnableViewState="false" %> 2 | <%@ OutputCache NoStore="true" Location="None" %> 3 | <%@ Import Namespace="System.Data.SqlClient" %> 4 | 5 | 6 | 7 | 8 | 9 | 10 | CPU 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 47 | 48 | 49 |
50 |
51 |
52 |
53 | 54 |
55 | 56 | 57 | 185 | 192 | 324 | 325 | -------------------------------------------------------------------------------- /Source/SQLServerDashboard/css/basic.css: -------------------------------------------------------------------------------- 1 | /* 2 | * SimpleModal Basic Modal Dialog 3 | * http://simplemodal.com 4 | * 5 | * Copyright (c) 2013 Eric Martin - http://ericmmartin.com 6 | * 7 | * Licensed under the MIT license: 8 | * http://www.opensource.org/licenses/mit-license.php 9 | */ 10 | 11 | #basic-modal-content {display:none;} 12 | #basic-modal-content pre{border:none; overflow-x: auto; color: white; background-color: #333; font-family: 'Lucida Console', 'Courier New'; font-size: 10pt} 13 | 14 | /* Overlay */ 15 | #simplemodal-overlay {background-color:#000;} 16 | 17 | /* Container */ 18 | #simplemodal-container {height:400px; width:900px; color:#bbb; background-color:#333; border:4px solid #444; padding:12px;} 19 | #simplemodal-container .simplemodal-data {padding:8px;} 20 | #simplemodal-container code {background:#141414; border-left:3px solid #65B43D; color:#bbb; display:block; font-size:12px; margin-bottom:12px; padding:4px 6px 6px;} 21 | #simplemodal-container a {color:#ddd;} 22 | #simplemodal-container a.modalCloseImg {background:url(../img/basic/x.png) no-repeat; width:25px; height:29px; display:inline; z-index:3200; position:absolute; top:-15px; right:-16px; cursor:pointer;} 23 | #simplemodal-container h3 {color:#84b8d9;} 24 | -------------------------------------------------------------------------------- /Source/SQLServerDashboard/css/basic_ie.css: -------------------------------------------------------------------------------- 1 | /* 2 | * SimpleModal Basic Modal Dialog 3 | * http://simplemodal.com 4 | * 5 | * Copyright (c) 2013 Eric Martin - http://ericmmartin.com 6 | * 7 | * Licensed under the MIT license: 8 | * http://www.opensource.org/licenses/mit-license.php 9 | */ 10 | 11 | /* IE 6 hacks */ 12 | #simplemodal-container a.modalCloseImg {background:none; right:-14px; width:22px; height:26px; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='img/basic/x.png',sizingMethod='scale');} -------------------------------------------------------------------------------- /Source/SQLServerDashboard/css/bootstrap-theme.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bootstrap v3.2.0 (http://getbootstrap.com) 3 | * Copyright 2011-2014 Twitter, Inc. 4 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 5 | */.btn-default,.btn-primary,.btn-success,.btn-info,.btn-warning,.btn-danger{text-shadow:0 -1px 0 rgba(0,0,0,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075)}.btn-default:active,.btn-primary:active,.btn-success:active,.btn-info:active,.btn-warning:active,.btn-danger:active,.btn-default.active,.btn-primary.active,.btn-success.active,.btn-info.active,.btn-warning.active,.btn-danger.active{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn:active,.btn.active{background-image:none}.btn-default{text-shadow:0 1px 0 #fff;background-image:-webkit-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-o-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e0e0e0));background-image:linear-gradient(to bottom,#fff 0,#e0e0e0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#dbdbdb;border-color:#ccc}.btn-default:hover,.btn-default:focus{background-color:#e0e0e0;background-position:0 -15px}.btn-default:active,.btn-default.active{background-color:#e0e0e0;border-color:#dbdbdb}.btn-default:disabled,.btn-default[disabled]{background-color:#e0e0e0;background-image:none}.btn-primary{background-image:-webkit-linear-gradient(top,#428bca 0,#2d6ca2 100%);background-image:-o-linear-gradient(top,#428bca 0,#2d6ca2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#428bca),to(#2d6ca2));background-image:linear-gradient(to bottom,#428bca 0,#2d6ca2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff2d6ca2', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#2b669a}.btn-primary:hover,.btn-primary:focus{background-color:#2d6ca2;background-position:0 -15px}.btn-primary:active,.btn-primary.active{background-color:#2d6ca2;border-color:#2b669a}.btn-primary:disabled,.btn-primary[disabled]{background-color:#2d6ca2;background-image:none}.btn-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#419641));background-image:linear-gradient(to bottom,#5cb85c 0,#419641 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#3e8f3e}.btn-success:hover,.btn-success:focus{background-color:#419641;background-position:0 -15px}.btn-success:active,.btn-success.active{background-color:#419641;border-color:#3e8f3e}.btn-success:disabled,.btn-success[disabled]{background-color:#419641;background-image:none}.btn-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#2aabd2));background-image:linear-gradient(to bottom,#5bc0de 0,#2aabd2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#28a4c9}.btn-info:hover,.btn-info:focus{background-color:#2aabd2;background-position:0 -15px}.btn-info:active,.btn-info.active{background-color:#2aabd2;border-color:#28a4c9}.btn-info:disabled,.btn-info[disabled]{background-color:#2aabd2;background-image:none}.btn-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#eb9316));background-image:linear-gradient(to bottom,#f0ad4e 0,#eb9316 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#e38d13}.btn-warning:hover,.btn-warning:focus{background-color:#eb9316;background-position:0 -15px}.btn-warning:active,.btn-warning.active{background-color:#eb9316;border-color:#e38d13}.btn-warning:disabled,.btn-warning[disabled]{background-color:#eb9316;background-image:none}.btn-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c12e2a));background-image:linear-gradient(to bottom,#d9534f 0,#c12e2a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#b92c28}.btn-danger:hover,.btn-danger:focus{background-color:#c12e2a;background-position:0 -15px}.btn-danger:active,.btn-danger.active{background-color:#c12e2a;border-color:#b92c28}.btn-danger:disabled,.btn-danger[disabled]{background-color:#c12e2a;background-image:none}.thumbnail,.img-thumbnail{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{background-color:#e8e8e8;background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{background-color:#357ebd;background-image:-webkit-linear-gradient(top,#428bca 0,#357ebd 100%);background-image:-o-linear-gradient(top,#428bca 0,#357ebd 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#428bca),to(#357ebd));background-image:linear-gradient(to bottom,#428bca 0,#357ebd 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0);background-repeat:repeat-x}.navbar-default{background-image:-webkit-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-o-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#f8f8f8));background-image:linear-gradient(to bottom,#fff 0,#f8f8f8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075)}.navbar-default .navbar-nav>.active>a{background-image:-webkit-linear-gradient(top,#ebebeb 0,#f3f3f3 100%);background-image:-o-linear-gradient(top,#ebebeb 0,#f3f3f3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#f3f3f3));background-image:linear-gradient(to bottom,#ebebeb 0,#f3f3f3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff3f3f3', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.075);box-shadow:inset 0 3px 9px rgba(0,0,0,.075)}.navbar-brand,.navbar-nav>li>a{text-shadow:0 1px 0 rgba(255,255,255,.25)}.navbar-inverse{background-image:-webkit-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-o-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#3c3c3c),to(#222));background-image:linear-gradient(to bottom,#3c3c3c 0,#222 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x}.navbar-inverse .navbar-nav>.active>a{background-image:-webkit-linear-gradient(top,#222 0,#282828 100%);background-image:-o-linear-gradient(top,#222 0,#282828 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#222),to(#282828));background-image:linear-gradient(to bottom,#222 0,#282828 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff282828', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.25);box-shadow:inset 0 3px 9px rgba(0,0,0,.25)}.navbar-inverse .navbar-brand,.navbar-inverse .navbar-nav>li>a{text-shadow:0 -1px 0 rgba(0,0,0,.25)}.navbar-static-top,.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}.alert{text-shadow:0 1px 0 rgba(255,255,255,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05)}.alert-success{background-image:-webkit-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#c8e5bc));background-image:linear-gradient(to bottom,#dff0d8 0,#c8e5bc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);background-repeat:repeat-x;border-color:#b2dba1}.alert-info{background-image:-webkit-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#b9def0));background-image:linear-gradient(to bottom,#d9edf7 0,#b9def0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);background-repeat:repeat-x;border-color:#9acfea}.alert-warning{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#f8efc0));background-image:linear-gradient(to bottom,#fcf8e3 0,#f8efc0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);background-repeat:repeat-x;border-color:#f5e79e}.alert-danger{background-image:-webkit-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-o-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#e7c3c3));background-image:linear-gradient(to bottom,#f2dede 0,#e7c3c3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);background-repeat:repeat-x;border-color:#dca7a7}.progress{background-image:-webkit-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#f5f5f5));background-image:linear-gradient(to bottom,#ebebeb 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x}.progress-bar{background-image:-webkit-linear-gradient(top,#428bca 0,#3071a9 100%);background-image:-o-linear-gradient(top,#428bca 0,#3071a9 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#428bca),to(#3071a9));background-image:linear-gradient(to bottom,#428bca 0,#3071a9 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3071a9', GradientType=0);background-repeat:repeat-x}.progress-bar-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#449d44));background-image:linear-gradient(to bottom,#5cb85c 0,#449d44 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);background-repeat:repeat-x}.progress-bar-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#31b0d5));background-image:linear-gradient(to bottom,#5bc0de 0,#31b0d5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);background-repeat:repeat-x}.progress-bar-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#ec971f));background-image:linear-gradient(to bottom,#f0ad4e 0,#ec971f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);background-repeat:repeat-x}.progress-bar-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c9302c));background-image:linear-gradient(to bottom,#d9534f 0,#c9302c 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);background-repeat:repeat-x}.progress-bar-striped{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.list-group{border-radius:4px;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{text-shadow:0 -1px 0 #3071a9;background-image:-webkit-linear-gradient(top,#428bca 0,#3278b3 100%);background-image:-o-linear-gradient(top,#428bca 0,#3278b3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#428bca),to(#3278b3));background-image:linear-gradient(to bottom,#428bca 0,#3278b3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3278b3', GradientType=0);background-repeat:repeat-x;border-color:#3278b3}.panel{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.05);box-shadow:0 1px 2px rgba(0,0,0,.05)}.panel-default>.panel-heading{background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.panel-primary>.panel-heading{background-image:-webkit-linear-gradient(top,#428bca 0,#357ebd 100%);background-image:-o-linear-gradient(top,#428bca 0,#357ebd 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#428bca),to(#357ebd));background-image:linear-gradient(to bottom,#428bca 0,#357ebd 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0);background-repeat:repeat-x}.panel-success>.panel-heading{background-image:-webkit-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#d0e9c6));background-image:linear-gradient(to bottom,#dff0d8 0,#d0e9c6 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);background-repeat:repeat-x}.panel-info>.panel-heading{background-image:-webkit-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#c4e3f3));background-image:linear-gradient(to bottom,#d9edf7 0,#c4e3f3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);background-repeat:repeat-x}.panel-warning>.panel-heading{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#faf2cc));background-image:linear-gradient(to bottom,#fcf8e3 0,#faf2cc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);background-repeat:repeat-x}.panel-danger>.panel-heading{background-image:-webkit-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-o-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#ebcccc));background-image:linear-gradient(to bottom,#f2dede 0,#ebcccc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);background-repeat:repeat-x}.well{background-image:-webkit-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#e8e8e8),to(#f5f5f5));background-image:linear-gradient(to bottom,#e8e8e8 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x;border-color:#dcdcdc;-webkit-box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1)} -------------------------------------------------------------------------------- /Source/SQLServerDashboard/css/dashboard.css: -------------------------------------------------------------------------------- 1 | .panel-body { 2 | padding: 0px; 3 | overflow-x: auto; 4 | margin: 0px; 5 | } 6 | 7 | .noscroll { 8 | overflow: visible; 9 | } 10 | 11 | .panel-padding { 12 | padding: 10px; 13 | } 14 | 15 | .panel-body-height { 16 | max-height: 200px; 17 | min-height: 100px; 18 | } 19 | 20 | .panel-body-height-large { 21 | max-height: 400px; 22 | min-height: 100px; 23 | } 24 | 25 | .panel-body div.progress { 26 | width: 50%; 27 | margin: 100px auto; 28 | } 29 | 30 | table { 31 | margin: 0px; 32 | font-size: 8pt; 33 | } 34 | 35 | td.large-cell { 36 | padding: 0px; 37 | margin: 0px; 38 | 39 | } 40 | 41 | td.large-cell div { 42 | height: 80px; 43 | width: 300px; 44 | overflow: auto; 45 | cursor: hand; 46 | cursor: pointer; 47 | padding: 0px; 48 | margin: 0px; 49 | 50 | } 51 | 52 | .demo-container { 53 | box-sizing: border-box; 54 | width: 95%; 55 | height: 200px; 56 | /*padding: 20px 15px 15px 15px; 57 | margin: 15px auto 30px auto;*/ 58 | border: 1px solid #ddd; 59 | background: #fff; 60 | background: linear-gradient(#f6f6f6 0, #fff 50px); 61 | background: -o-linear-gradient(#f6f6f6 0, #fff 50px); 62 | background: -ms-linear-gradient(#f6f6f6 0, #fff 50px); 63 | background: -moz-linear-gradient(#f6f6f6 0, #fff 50px); 64 | background: -webkit-linear-gradient(#f6f6f6 0, #fff 50px); 65 | box-shadow: 0 3px 10px rgba(0,0,0,0.15); 66 | -o-box-shadow: 0 3px 10px rgba(0,0,0,0.1); 67 | -ms-box-shadow: 0 3px 10px rgba(0,0,0,0.1); 68 | -moz-box-shadow: 0 3px 10px rgba(0,0,0,0.1); 69 | -webkit-box-shadow: 0 3px 10px rgba(0,0,0,0.1); 70 | } 71 | 72 | .demo-placeholder { 73 | width: 95%; 74 | height: 95%; 75 | font-size: 14px; 76 | line-height: 1.2em; 77 | } 78 | 79 | .legend table { 80 | border-spacing: 5px; 81 | } 82 | 83 | .tab_iframe { 84 | width: 80%; 85 | border: none; 86 | overflow: hidden; 87 | visibility:hidden; 88 | position: absolute; 89 | } -------------------------------------------------------------------------------- /Source/SQLServerDashboard/fonts/glyphicons-halflings-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oazabir/SQLServerPerformanceDashboard/3847e8003f266d5ebb0926d585d5cb7f8adce0a6/Source/SQLServerDashboard/fonts/glyphicons-halflings-regular.eot -------------------------------------------------------------------------------- /Source/SQLServerDashboard/fonts/glyphicons-halflings-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oazabir/SQLServerPerformanceDashboard/3847e8003f266d5ebb0926d585d5cb7f8adce0a6/Source/SQLServerDashboard/fonts/glyphicons-halflings-regular.ttf -------------------------------------------------------------------------------- /Source/SQLServerDashboard/fonts/glyphicons-halflings-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oazabir/SQLServerPerformanceDashboard/3847e8003f266d5ebb0926d585d5cb7f8adce0a6/Source/SQLServerDashboard/fonts/glyphicons-halflings-regular.woff -------------------------------------------------------------------------------- /Source/SQLServerDashboard/idle.html: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Idle 5 | 6 | 7 |

Let's not keep this running unnecessarily and waste valuable resource on the database.

8 | 9 | 10 | -------------------------------------------------------------------------------- /Source/SQLServerDashboard/img/basic/x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oazabir/SQLServerPerformanceDashboard/3847e8003f266d5ebb0926d585d5cb7f8adce0a6/Source/SQLServerDashboard/img/basic/x.png -------------------------------------------------------------------------------- /Source/SQLServerDashboard/js/Dashboard.js: -------------------------------------------------------------------------------- 1 |  2 | var plots = []; 3 | 4 | function initData(count) { 5 | var data = []; 6 | for (var i = 0; i < count; i++) 7 | data.push(0); 8 | return data; 9 | } 10 | 11 | function updatePlot() { 12 | if (typeof $.plot == "undefined") 13 | return; 14 | var index = 0; 15 | 16 | $.each(datasets, function (key, val) { 17 | var items = []; 18 | for (var i = 0; i < val.data.length; i++) 19 | items.push([i, val.data[i]]); 20 | 21 | var data = { color: val.color, data: items, threshold: val.threshold }; 22 | 23 | if (plots[index] != null) { 24 | plot = plots[index]; 25 | plot.setData([data]); 26 | plot.draw(); 27 | } 28 | else { 29 | plot = $.plot("#placeholder" + (index + 1), [data], { 30 | series: { 31 | //shadowSize: 0 // Drawing is faster without shadows 32 | }, 33 | lines: { show: true, fill: true }, 34 | grid: { 35 | hoverable: true, 36 | clickable: true 37 | }, 38 | yaxis: { 39 | min: 0, 40 | max: val.ymax 41 | }, 42 | xaxis: { 43 | show: false 44 | } 45 | }); 46 | $("#placeholder" + (index + 1)).bind("plothover", function (event, pos, item) { 47 | var str = "(" + pos.y.toFixed(2) + ")"; 48 | $("#hoverdata").text(str); 49 | 50 | if (item) { 51 | var x = item.datapoint[0].toFixed(2), 52 | y = item.datapoint[1].toFixed(2); 53 | 54 | $("#tooltip").html(item.label + " = " + y) 55 | .css({ top: item.pageY + 5, left: item.pageX + 5 }) 56 | .fadeIn(200); 57 | } else { 58 | $("#tooltip").hide(); 59 | } 60 | 61 | }); 62 | plot.draw(); 63 | plots[index] = plot; 64 | } 65 | ++index; 66 | }); 67 | } 68 | 69 | window.setContent = function(iframe, id) { 70 | $('#' + id) 71 | .find('td.large-cell').off('click'); 72 | 73 | if ($('#' + id).scrollLeft() == 0 && $('#' + id).scrollTop() == 0) { 74 | $('#' + id) 75 | .html($(iframe).contents().find("form").html()) 76 | .dblclick(function () { 77 | iframe.contentWindow.location.reload(); 78 | }) 79 | .find('td.large-cell').find('div').click(function () { 80 | $('#content_text').text($(this).html()); 81 | $('#basic-modal-content').modal(); 82 | }); 83 | } 84 | 85 | $(iframe).contents().find("form").find(".x-axis").each(function (i, e) { 86 | var x = $(e); 87 | var y = x.next('.y-axis'); 88 | var xname = x.text(); 89 | var yvalue = parseFloat(y.text()); 90 | if (datasets[xname]) { 91 | var data = datasets[xname].data; 92 | data.pop(); 93 | data.splice(0, 0, yvalue); 94 | } 95 | }); 96 | 97 | updatePlot(); 98 | } 99 | 100 | $(document).ready(function () { 101 | $("
").css({ 102 | position: "absolute", 103 | display: "none", 104 | border: "1px solid #fdd", 105 | padding: "2px", 106 | "background-color": "#fee", 107 | opacity: 0.80 108 | }).appendTo("body"); 109 | //updatePlot(); 110 | }); -------------------------------------------------------------------------------- /Source/SQLServerDashboard/js/ScriptsForWidgets.js: -------------------------------------------------------------------------------- 1 | window.refreshEvery = function(mili) { 2 | var refreshtimer = window.setTimeout(function () { window.location.reload(); }, mili); 3 | 4 | document.ondblclick = function () { 5 | window.clearTimeout(refreshtimer); 6 | } 7 | } 8 | 9 | window.applyPlotAxis = function(plot) { 10 | $('td').each(function (i, e) { 11 | var td = $(e); 12 | if (td.text().trim().length > 0) { 13 | for (var i = 0; i < plot.length; i++) { 14 | if (plot[i] == td.text().trim()) { 15 | td.addClass("x-axis"); 16 | td.next().addClass("y-axis"); 17 | } 18 | } 19 | } 20 | }) 21 | } 22 | 23 | window.applyLargeCells = function(selector) { 24 | $('tr').each(function (i, tr) { 25 | var td = $(selector, tr); 26 | td.html('
' + td.html() + '
'); 27 | td.addClass('large-cell'); 28 | td.find('div').click(function () { 29 | alert($(this).text()) 30 | }); 31 | }); 32 | } -------------------------------------------------------------------------------- /Source/SQLServerDashboard/js/jquery.fixedheadertable.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * jquery.fixedHeaderTable. The jQuery fixedHeaderTable plugin 3 | * 4 | * Copyright (c) 2013 Mark Malek 5 | * http://fixedheadertable.com 6 | * 7 | * Licensed under MIT 8 | * http://www.opensource.org/licenses/mit-license.php 9 | * 10 | * http://docs.jquery.com/Plugins/Authoring 11 | * jQuery authoring guidelines 12 | * 13 | * Launch : October 2009 14 | * Version : 1.3 15 | * Released: May 9th, 2011 16 | * 17 | * 18 | * all CSS sizing (width,height) is done in pixels (px) 19 | */(function (c) { c.fn.fixedHeaderTable = function (m) { var u = { width: "100%", height: "100%", themeClass: "fht-default", borderCollapse: !0, fixedColumns: 0, fixedColumn: !1, sortable: !1, autoShow: !0, footer: !1, cloneHeadToFoot: !1, autoResize: !1, create: null }, b = {}, n = { init: function (a) { b = c.extend({}, u, a); return this.each(function () { var a = c(this); h._isTable(a) ? (n.setup.apply(this, Array.prototype.slice.call(arguments, 1)), c.isFunction(b.create) && b.create.call(this)) : c.error("Invalid table mark-up") }) }, setup: function () { var a = c(this), d = a.find("thead"), e = a.find("tfoot"), g = 0, f, k, p; b.originalTable = c(this).clone(); b.includePadding = h._isPaddingIncludedWithWidth(); b.scrollbarOffset = h._getScrollbarWidth(); b.themeClassName = b.themeClass; f = -1 < b.width.search("%") ? a.parent().width() - b.scrollbarOffset : b.width - b.scrollbarOffset; a.css({ width: f }); a.closest(".fht-table-wrapper").length || (a.addClass("fht-table"), a.wrap('
')); f = a.closest(".fht-table-wrapper"); !0 == b.fixedColumn && 0 >= b.fixedColumns && (b.fixedColumns = 1); 0 < b.fixedColumns && 0 == f.find(".fht-fixed-column").length && (a.wrap('
'), c('
').prependTo(f), k = f.find(".fht-fixed-body")); f.css({ width: b.width, height: b.height }).addClass(b.themeClassName); a.hasClass("fht-table-init") || a.wrap('
'); p = a.closest(".fht-tbody"); var l = h._getTableProps(a); h._setupClone(p, l.tbody); a.hasClass("fht-table-init") ? k = f.find("div.fht-thead") : (k = 0 < b.fixedColumns ? c('
').prependTo(k) : c('
').prependTo(f), k.find("table.fht-table").addClass(b.originalTable.attr("class")).attr("style", b.originalTable.attr("style")), d.clone().appendTo(k.find("table"))); h._setupClone(k, l.thead); a.css({ "margin-top": -k.outerHeight(!0) }); !0 == b.footer && (h._setupTableFooter(a, this, l), e.length || (e = f.find("div.fht-tfoot table")), g = e.outerHeight(!0)); d = f.height() - d.outerHeight(!0) - g - l.border; p.css({ height: d }); a.addClass("fht-table-init"); "undefined" !== typeof b.altClass && n.altRows.apply(this); 0 < b.fixedColumns && h._setupFixedColumn(a, this, l); b.autoShow || f.hide(); h._bindScroll(p, l); return this }, resize: function () { return this }, altRows: function (a) { var d = c(this); a = "undefined" !== typeof a ? a : b.altClass; d.closest(".fht-table-wrapper").find("tbody tr:odd:not(:hidden)").addClass(a) }, show: function (a, d, b) { var g = c(this), f = g.closest(".fht-table-wrapper"); if ("undefined" !== typeof a && "number" === typeof a) return f.show(a, function () { c.isFunction(d) && d.call(this) }), this; if ("undefined" !== typeof a && "string" === typeof a && "undefined" !== typeof d && "number" === typeof d) return f.show(a, d, function () { c.isFunction(b) && b.call(this) }), this; g.closest(".fht-table-wrapper").show(); c.isFunction(a) && a.call(this); return this }, hide: function (a, d, b) { var g = c(this), f = g.closest(".fht-table-wrapper"); if ("undefined" !== typeof a && "number" === typeof a) return f.hide(a, function () { c.isFunction(b) && b.call(this) }), this; if ("undefined" !== typeof a && "string" === typeof a && "undefined" !== typeof d && "number" === typeof d) return f.hide(a, d, function () { c.isFunction(b) && b.call(this) }), this; g.closest(".fht-table-wrapper").hide(); c.isFunction(b) && b.call(this); return this }, destroy: function () { var a = c(this), d = a.closest(".fht-table-wrapper"); a.insertBefore(d).removeAttr("style").append(d.find("tfoot")).removeClass("fht-table fht-table-init").find(".fht-cell").remove(); d.remove(); return this } }, h = { _isTable: function (a) { var d = a.is("table"), b = 0 < a.find("thead").length; a = 0 < a.find("tbody").length; return d && b && a ? !0 : !1 }, _bindScroll: function (a) { var d = a.closest(".fht-table-wrapper"), c = a.siblings(".fht-thead"), g = a.siblings(".fht-tfoot"); a.bind("scroll", function () { 0 < b.fixedColumns && d.find(".fht-fixed-column").find(".fht-tbody table").css({ "margin-top": -a.scrollTop() }); c.find("table").css({ "margin-left": -this.scrollLeft }); (b.footer || b.cloneHeadToFoot) && g.find("table").css({ "margin-left": -this.scrollLeft }) }) }, _fixHeightWithCss: function (a, d) { b.includePadding ? a.css({ height: a.height() + d.border }) : a.css({ height: a.parent().height() + d.border }) }, _fixWidthWithCss: function (a, d, e) { b.includePadding ? a.each(function () { c(this).css({ width: void 0 == e ? c(this).width() : e }) }) : a.each(function () { c(this).css({ width: void 0 == e ? c(this).parent().width() : e }) }) }, _setupFixedColumn: function (a, d, e) { var g = a.closest(".fht-table-wrapper"), f = g.find(".fht-fixed-body"); d = g.find(".fht-fixed-column"); var k = c('
'), p = c('
'); a = c('
'); var g = g.width(), l = f.find(".fht-tbody").height() - b.scrollbarOffset, q, t, r, s; k.find("table.fht-table").addClass(b.originalTable.attr("class")); p.find("table.fht-table").addClass(b.originalTable.attr("class")); a.find("table.fht-table").addClass(b.originalTable.attr("class")); q = f.find(".fht-thead thead tr > *:lt(" + b.fixedColumns + ")"); r = b.fixedColumns * e.border; q.each(function () { r += c(this).outerWidth(!0) }); h._fixHeightWithCss(q, e); h._fixWidthWithCss(q, e); var m = []; q.each(function () { m.push(c(this).width()) }); t = f.find("tbody tr > *:not(:nth-child(n+" + (b.fixedColumns + 1) + "))").each(function (a) { h._fixHeightWithCss(c(this), e); h._fixWidthWithCss(c(this), e, m[a % b.fixedColumns]) }); k.appendTo(d).find("tr").append(q.clone()); p.appendTo(d).css({ "margin-top": -1, height: l + e.border }); t.each(function (a) { 0 == a % b.fixedColumns && (s = c("").appendTo(p.find("tbody")), b.altClass && c(this).parent().hasClass(b.altClass) && s.addClass(b.altClass)); c(this).clone().appendTo(s) }); d.css({ height: 0, width: r }); var n = d.find(".fht-tbody .fht-table").height() - d.find(".fht-tbody").height(); d.find(".fht-tbody .fht-table").bind("mousewheel", function (a, d, b, e) { if (0 != e) return a = parseInt(c(this).css("marginTop"), 10) + (0 < e ? 120 : -120), 0 < a && (a = 0), a < -n && (a = -n), c(this).css("marginTop", a), f.find(".fht-tbody").scrollTop(-a).scroll(), !1 }); f.css({ width: g }); if (!0 == b.footer || !0 == b.cloneHeadToFoot) k = f.find(".fht-tfoot tr > *:lt(" + b.fixedColumns + ")"), h._fixHeightWithCss(k, e), a.appendTo(d).find("tr").append(k.clone()), d = a.find("table").innerWidth(), a.css({ top: b.scrollbarOffset, width: d }) }, _setupTableFooter: function (a, d, e) { d = a.closest(".fht-table-wrapper"); var g = a.find("tfoot"); a = d.find("div.fht-tfoot"); a.length || (a = 0 < b.fixedColumns ? c('
').appendTo(d.find(".fht-fixed-body")) : c('
').appendTo(d)); a.find("table.fht-table").addClass(b.originalTable.attr("class")); switch (!0) { case !g.length && !0 == b.cloneHeadToFoot && !0 == b.footer: e = d.find("div.fht-thead"); a.empty(); e.find("table").clone().appendTo(a); break; case g.length && !1 == b.cloneHeadToFoot && !0 == b.footer: a.find("table").append(g).css({ "margin-top": -e.border }), h._setupClone(a, e.tfoot) } }, _getTableProps: function (a) { var d = { thead: {}, tbody: {}, tfoot: {}, border: 0 }, c = 1; !0 == b.borderCollapse && (c = 2); d.border = (a.find("th:first-child").outerWidth() - a.find("th:first-child").innerWidth()) / c; d.thead = h._getColumnsWidth(a.find("thead tr")); d.tfoot = h._getColumnsWidth(a.find("tfoot tr")); d.tbody = h._getColumnsWidth(a.find("tbody tr")); return d }, _getColumnsWidth: function (a) { var d = {}, b = {}, g = 0, f, k; f = h._getColumnsCount(a); for (k = 0; k < f; k++) b[k] = { rowspan: 1, colspan: 1 }; a.each(function (a) { var l = 0, k = 0; c(this).children().each(function (a) { for (var f = parseInt(c(this).attr("colspan")) || 1, h = parseInt(c(this).attr("rowspan")) || 1; 1 < b[a + k].rowspan;) b[a + k].rowspan--, k += b[a].colspan; a += l + k; l += f - 1; 1 < h && (b[a] = { rowspan: h, colspan: f }); if ("undefined" === typeof d[a] || 1 != d[a].colspan) d[a] = { width: c(this).width() + parseInt(c(this).css("border-left-width")) + parseInt(c(this).css("border-right-width")), colspan: f }, 1 == f && g++ }); if (g == f) return !1 }); return d }, _getColumnsCount: function (a) { var b = 0; a.each(function (a) { var g; c(this).children().each(function (a) { a = parseInt(c(this).attr("colspan")) || 1; g = parseInt(c(this).attr("rowspan")) || 1; b += a }); if (1 < b || 1 == g) return !1 }); return b }, _setupClone: function (a, d) { var e = a.find("thead").length ? "thead tr" : a.find("tfoot").length ? "tfoot tr" : "tbody tr", g = {}, e = a.find(e); columnsCount = h._getColumnsCount(e); for (i = 0; i < columnsCount; i++) g[i] = { rowspan: 1, colspan: 1 }; e.each(function (a) { var e = 0, h = 0; c(this).children().each(function (a) { for (var f = parseInt(c(this).attr("colspan")) || 1, m = parseInt(c(this).attr("rowspan")) || 1; 1 < g[a + h].rowspan;) g[a + h].rowspan--, h += g[a].colspan; a += e + h; e += f - 1; 1 < m && (g[a] = { rowspan: m, colspan: f }); "undefined" !== typeof d[a] && d[a].colspan == f && ((c(this).find("div.fht-cell").length ? c(this).find("div.fht-cell") : c('
').appendTo(c(this))).css({ width: parseInt(d[a].width, 10) }), c(this).closest(".fht-tbody").length || !c(this).is(":last-child") || c(this).closest(".fht-fixed-column").length || (a = Math.max((c(this).innerWidth() - c(this).width()) / 2, b.scrollbarOffset), c(this).css({ "padding-right": parseInt(c(this).css("padding-right")) + a + "px" }))) }) }) }, _isPaddingIncludedWithWidth: function () { var a = c('
test
'), d, e; a.addClass(b.originalTable.attr("class")); a.appendTo("body"); d = a.find("td").height(); a.find("td").css("height", a.find("tr").height()); e = a.find("td").height(); a.remove(); return d != e ? !0 : !1 }, _getScrollbarWidth: function () { var a = 0; if (!a) if (/msie/.test(navigator.userAgent.toLowerCase())) { var b = c('').css({ position: "absolute", top: -1E3, left: -1E3 }).appendTo("body"), e = c('').css({ position: "absolute", top: -1E3, left: -1E3 }).appendTo("body"), a = b.width() - e.width() + 2; b.add(e).remove() } else b = c("
").css({ width: 100, height: 100, overflow: "auto", position: "absolute", top: -1E3, left: -1E3 }).prependTo("body").append("
").find("div").css({ width: "100%", height: 200 }), a = 100 - b.width(), b.parent().remove(); return a } }; if (n[m]) return n[m].apply(this, Array.prototype.slice.call(arguments, 1)); if ("object" !== typeof m && m) c.error('Method "' + m + '" does not exist in fixedHeaderTable plugin!'); else return n.init.apply(this, arguments) } })(jQuery); 20 | -------------------------------------------------------------------------------- /Source/SQLServerDashboard/js/jquery.flot.baseline.js: -------------------------------------------------------------------------------- 1 | /* Flot plugin for thresholding data. 2 | 3 | Copyright (c) 2007-2014 IOLA and Ole Laursen. 4 | Licensed under the MIT license. 5 | 6 | The plugin supports these options: 7 | 8 | series: { 9 | threshold: { 10 | below: number 11 | color: colorspec 12 | } 13 | } 14 | 15 | It can also be applied to a single series, like this: 16 | 17 | $.plot( $("#placeholder"), [{ 18 | data: [ ... ], 19 | threshold: { ... } 20 | }]) 21 | 22 | An array can be passed for multiple thresholding, like this: 23 | 24 | threshold: [{ 25 | below: number1 26 | color: color1 27 | },{ 28 | below: number2 29 | color: color2 30 | }] 31 | 32 | These multiple threshold objects can be passed in any order since they are 33 | sorted by the processing function. 34 | 35 | The data points below "below" are drawn with the specified color. This makes 36 | it easy to mark points below 0, e.g. for budget data. 37 | 38 | Internally, the plugin works by splitting the data into two series, above and 39 | below the threshold. The extra series below the threshold will have its label 40 | cleared and the special "originSeries" attribute set to the original series. 41 | You may need to check for this in hover events. 42 | 43 | */ 44 | 45 | (function ($) { 46 | var options = { 47 | series: { threshold: null } // or { below: number, color: color spec} 48 | }; 49 | 50 | function init(plot) { 51 | function thresholdData(plot, s, datapoints, below, color) { 52 | var ps = datapoints.pointsize, i, x, y, p, prevp, 53 | thresholded = $.extend({}, s); // note: shallow copy 54 | 55 | thresholded.datapoints = { points: [], pointsize: ps, format: datapoints.format }; 56 | thresholded.label = null; 57 | thresholded.color = color; 58 | thresholded.threshold = null; 59 | thresholded.originSeries = s; 60 | thresholded.data = []; 61 | 62 | var origpoints = datapoints.points, 63 | addCrossingPoints = s.lines.show; 64 | 65 | var threspoints = []; 66 | var newpoints = []; 67 | var m; 68 | 69 | for (i = 0; i < origpoints.length; i += ps) { 70 | x = origpoints[i]; 71 | y = origpoints[i + 1]; 72 | 73 | prevp = p; 74 | if (y < below) 75 | p = threspoints; 76 | else 77 | p = newpoints; 78 | 79 | if (addCrossingPoints && prevp != p && x != null 80 | && i > 0 && origpoints[i - ps] != null) { 81 | var interx = x + (below - y) * (x - origpoints[i - ps]) / (y - origpoints[i - ps + 1]); 82 | prevp.push(interx); 83 | prevp.push(below); 84 | for (m = 2; m < ps; ++m) 85 | prevp.push(origpoints[i + m]); 86 | 87 | p.push(null); // start new segment 88 | p.push(null); 89 | for (m = 2; m < ps; ++m) 90 | p.push(origpoints[i + m]); 91 | p.push(interx); 92 | p.push(below); 93 | for (m = 2; m < ps; ++m) 94 | p.push(origpoints[i + m]); 95 | } 96 | 97 | p.push(x); 98 | p.push(y); 99 | for (m = 2; m < ps; ++m) 100 | p.push(origpoints[i + m]); 101 | } 102 | 103 | datapoints.points = newpoints; 104 | thresholded.datapoints.points = threspoints; 105 | 106 | if (thresholded.datapoints.points.length > 0) { 107 | var origIndex = $.inArray(s, plot.getData()); 108 | // Insert newly-generated series right after original one (to prevent it from becoming top-most) 109 | plot.getData().splice(origIndex + 1, 0, thresholded); 110 | } 111 | 112 | // FIXME: there are probably some edge cases left in bars 113 | } 114 | 115 | function processThresholds(plot, s, datapoints) { 116 | if (!s.threshold) 117 | return; 118 | 119 | if (s.threshold instanceof Array) { 120 | s.threshold.sort(function (a, b) { 121 | return a.below - b.below; 122 | }); 123 | 124 | $(s.threshold).each(function (i, th) { 125 | thresholdData(plot, s, datapoints, th.below, th.color); 126 | }); 127 | } 128 | else { 129 | thresholdData(plot, s, datapoints, s.threshold.below, s.threshold.color); 130 | } 131 | } 132 | 133 | plot.hooks.processDatapoints.push(processThresholds); 134 | } 135 | 136 | $.plot.plugins.push({ 137 | init: init, 138 | options: options, 139 | name: 'threshold', 140 | version: '1.2' 141 | }); 142 | })(jQuery); -------------------------------------------------------------------------------- /Source/SQLServerDashboard/js/jquery.flot.time.min.js: -------------------------------------------------------------------------------- 1 | /* Javascript plotting library for jQuery, version 0.8.3. 2 | 3 | Copyright (c) 2007-2014 IOLA and Ole Laursen. 4 | Licensed under the MIT license. 5 | 6 | */ 7 | (function($){var options={xaxis:{timezone:null,timeformat:null,twelveHourClock:false,monthNames:null}};function floorInBase(n,base){return base*Math.floor(n/base)}function formatDate(d,fmt,monthNames,dayNames){if(typeof d.strftime=="function"){return d.strftime(fmt)}var leftPad=function(n,pad){n=""+n;pad=""+(pad==null?"0":pad);return n.length==1?pad+n:n};var r=[];var escape=false;var hours=d.getHours();var isAM=hours<12;if(monthNames==null){monthNames=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]}if(dayNames==null){dayNames=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"]}var hours12;if(hours>12){hours12=hours-12}else if(hours==0){hours12=12}else{hours12=hours}for(var i=0;i=minSize){break}}var size=spec[i][0];var unit=spec[i][1];if(unit=="year"){if(opts.minTickSize!=null&&opts.minTickSize[1]=="year"){size=Math.floor(opts.minTickSize[0])}else{var magn=Math.pow(10,Math.floor(Math.log(axis.delta/timeUnitSize.year)/Math.LN10));var norm=axis.delta/timeUnitSize.year/magn;if(norm<1.5){size=1}else if(norm<3){size=2}else if(norm<7.5){size=5}else{size=10}size*=magn}if(size<1){size=1}}axis.tickSize=opts.tickSize||[size,unit];var tickSize=axis.tickSize[0];unit=axis.tickSize[1];var step=tickSize*timeUnitSize[unit];if(unit=="second"){d.setSeconds(floorInBase(d.getSeconds(),tickSize))}else if(unit=="minute"){d.setMinutes(floorInBase(d.getMinutes(),tickSize))}else if(unit=="hour"){d.setHours(floorInBase(d.getHours(),tickSize))}else if(unit=="month"){d.setMonth(floorInBase(d.getMonth(),tickSize))}else if(unit=="quarter"){d.setMonth(3*floorInBase(d.getMonth()/3,tickSize))}else if(unit=="year"){d.setFullYear(floorInBase(d.getFullYear(),tickSize))}d.setMilliseconds(0);if(step>=timeUnitSize.minute){d.setSeconds(0)}if(step>=timeUnitSize.hour){d.setMinutes(0)}if(step>=timeUnitSize.day){d.setHours(0)}if(step>=timeUnitSize.day*4){d.setDate(1)}if(step>=timeUnitSize.month*2){d.setMonth(floorInBase(d.getMonth(),3))}if(step>=timeUnitSize.quarter*2){d.setMonth(floorInBase(d.getMonth(),6))}if(step>=timeUnitSize.year){d.setMonth(0)}var carry=0;var v=Number.NaN;var prev;do{prev=v;v=d.getTime();ticks.push(v);if(unit=="month"||unit=="quarter"){if(tickSize<1){d.setDate(1);var start=d.getTime();d.setMonth(d.getMonth()+(unit=="quarter"?3:1));var end=d.getTime();d.setTime(v+carry*timeUnitSize.hour+(end-start)*tickSize);carry=d.getHours();d.setHours(0)}else{d.setMonth(d.getMonth()+tickSize*(unit=="quarter"?3:1))}}else if(unit=="year"){d.setFullYear(d.getFullYear()+tickSize)}else{d.setTime(v+step)}}while(v e) return } clearTimeout(d.tId), d.idle && g(b), d.lastActive = +new Date, d.pageX = b.pageX, d.pageY = b.pageY, d.tId = setTimeout(g, d.timeout) } }, i = function () { var b = a.data(c, "idleTimerObj") || {}; b.idle = b.idleBackup, b.olddate = +new Date, b.lastActive = b.olddate, b.remaining = null, clearTimeout(b.tId), b.idle || (b.tId = setTimeout(g, b.timeout)) }, j = function () { var b = a.data(c, "idleTimerObj") || {}; null == b.remaining && (b.remaining = b.timeout - (+new Date - b.olddate), clearTimeout(b.tId)) }, k = function () { var b = a.data(c, "idleTimerObj") || {}; null != b.remaining && (b.idle || (b.tId = setTimeout(g, b.remaining)), b.remaining = null) }, l = function () { var b = a.data(c, "idleTimerObj") || {}; clearTimeout(b.tId), e.removeData("idleTimerObj"), e.off("._idleTimer") }, m = function () { var b = a.data(c, "idleTimerObj") || {}; if (b.idle) return 0; if (null != b.remaining) return b.remaining; var d = b.timeout - (+new Date - b.lastActive); return 0 > d && (d = 0), d }; if (null === b && "undefined" != typeof f.idle) return i(), e; if (null === b); else { if (null !== b && "undefined" == typeof f.idle) return !1; if ("destroy" === b) return l(), e; if ("pause" === b) return j(), e; if ("resume" === b) return k(), e; if ("reset" === b) return i(), e; if ("getRemainingTime" === b) return m(); if ("getElapsedTime" === b) return +new Date - f.olddate; if ("getLastActiveTime" === b) return f.lastActive; if ("isIdle" === b) return f.idle } return e.on(a.trim((d.events + " ").split(" ").join("._idleTimer ")), function (a) { h(a) }), f = a.extend({}, { olddate: +new Date, lastActive: +new Date, idle: d.idle, idleBackup: d.idle, timeout: d.timeout, remaining: null, tId: null, pageX: null, pageY: null }), f.idle || (f.tId = setTimeout(g, f.timeout)), a.data(c, "idleTimerObj", f), e }, a.fn.idleTimer = function (b) { return this[0] ? a.idleTimer(b, this[0]) : this } }(jQuery); -------------------------------------------------------------------------------- /Source/SQLServerDashboard/js/jquery.simplemodal.js: -------------------------------------------------------------------------------- 1 | /* 2 | * SimpleModal 1.4.4 - jQuery Plugin 3 | * http://simplemodal.com/ 4 | * Copyright (c) 2013 Eric Martin 5 | * Licensed under MIT and GPL 6 | * Date: Sun, Jan 20 2013 15:58:56 -0800 7 | */ 8 | (function(b){"function"===typeof define&&define.amd?define(["jquery"],b):b(jQuery)})(function(b){var j=[],n=b(document),k=navigator.userAgent.toLowerCase(),l=b(window),g=[],o=null,p=/msie/.test(k)&&!/opera/.test(k),q=/opera/.test(k),m,r;m=p&&/msie 6./.test(k)&&"object"!==typeof window.XMLHttpRequest;r=p&&/msie 7.0/.test(k);b.modal=function(a,h){return b.modal.impl.init(a,h)};b.modal.close=function(){b.modal.impl.close()};b.modal.focus=function(a){b.modal.impl.focus(a)};b.modal.setContainerDimensions= 9 | function(){b.modal.impl.setContainerDimensions()};b.modal.setPosition=function(){b.modal.impl.setPosition()};b.modal.update=function(a,h){b.modal.impl.update(a,h)};b.fn.modal=function(a){return b.modal.impl.init(this,a)};b.modal.defaults={appendTo:"body",focus:!0,opacity:50,overlayId:"simplemodal-overlay",overlayCss:{},containerId:"simplemodal-container",containerCss:{},dataId:"simplemodal-data",dataCss:{},minHeight:null,minWidth:null,maxHeight:null,maxWidth:null,autoResize:!1,autoPosition:!0,zIndex:1E3, 10 | close:!0,closeHTML:'',closeClass:"simplemodal-close",escClose:!0,overlayClose:!1,fixed:!0,position:null,persist:!1,modal:!0,onOpen:null,onShow:null,onClose:null};b.modal.impl={d:{},init:function(a,h){if(this.d.data)return!1;o=p&&!b.support.boxModel;this.o=b.extend({},b.modal.defaults,h);this.zIndex=this.o.zIndex;this.occb=!1;if("object"===typeof a){if(a=a instanceof b?a:b(a),this.d.placeholder=!1,0").attr("id", 11 | "simplemodal-placeholder").css({display:"none"})),this.d.placeholder=!0,this.display=a.css("display"),!this.o.persist))this.d.orig=a.clone(!0)}else if("string"===typeof a||"number"===typeof a)a=b("
").html(a);else return alert("SimpleModal Error: Unsupported data type: "+typeof a),this;this.create(a);this.open();b.isFunction(this.o.onShow)&&this.o.onShow.apply(this,[this.d]);return this},create:function(a){this.getDimensions();if(this.o.modal&&m)this.d.iframe=b('').css(b.extend(this.o.iframeCss, 12 | {display:"none",opacity:0,position:"fixed",height:g[0],width:g[1],zIndex:this.o.zIndex,top:0,left:0})).appendTo(this.o.appendTo);this.d.overlay=b("
").attr("id",this.o.overlayId).addClass("simplemodal-overlay").css(b.extend(this.o.overlayCss,{display:"none",opacity:this.o.opacity/100,height:this.o.modal?j[0]:0,width:this.o.modal?j[1]:0,position:"fixed",left:0,top:0,zIndex:this.o.zIndex+1})).appendTo(this.o.appendTo);this.d.container=b("
").attr("id",this.o.containerId).addClass("simplemodal-container").css(b.extend({position:this.o.fixed? 13 | "fixed":"absolute"},this.o.containerCss,{display:"none",zIndex:this.o.zIndex+2})).append(this.o.close&&this.o.closeHTML?b(this.o.closeHTML).addClass(this.o.closeClass):"").appendTo(this.o.appendTo);this.d.wrap=b("
").attr("tabIndex",-1).addClass("simplemodal-wrap").css({height:"100%",outline:0,width:"100%"}).appendTo(this.d.container);this.d.data=a.attr("id",a.attr("id")||this.o.dataId).addClass("simplemodal-data").css(b.extend(this.o.dataCss,{display:"none"})).appendTo("body");this.setContainerDimensions(); 14 | this.d.data.appendTo(this.d.wrap);(m||o)&&this.fixIE()},bindEvents:function(){var a=this;b("."+a.o.closeClass).bind("click.simplemodal",function(b){b.preventDefault();a.close()});a.o.modal&&a.o.close&&a.o.overlayClose&&a.d.overlay.bind("click.simplemodal",function(b){b.preventDefault();a.close()});n.bind("keydown.simplemodal",function(b){a.o.modal&&9===b.keyCode?a.watchTab(b):a.o.close&&a.o.escClose&&27===b.keyCode&&(b.preventDefault(),a.close())});l.bind("resize.simplemodal orientationchange.simplemodal", 15 | function(){a.getDimensions();a.o.autoResize?a.setContainerDimensions():a.o.autoPosition&&a.setPosition();m||o?a.fixIE():a.o.modal&&(a.d.iframe&&a.d.iframe.css({height:g[0],width:g[1]}),a.d.overlay.css({height:j[0],width:j[1]}))})},unbindEvents:function(){b("."+this.o.closeClass).unbind("click.simplemodal");n.unbind("keydown.simplemodal");l.unbind(".simplemodal");this.d.overlay.unbind("click.simplemodal")},fixIE:function(){var a=this.o.position;b.each([this.d.iframe||null,!this.o.modal?null:this.d.overlay, 16 | "fixed"===this.d.container.css("position")?this.d.container:null],function(b,e){if(e){var f=e[0].style;f.position="absolute";if(2>b)f.removeExpression("height"),f.removeExpression("width"),f.setExpression("height",'document.body.scrollHeight > document.body.clientHeight ? document.body.scrollHeight : document.body.clientHeight + "px"'),f.setExpression("width",'document.body.scrollWidth > document.body.clientWidth ? document.body.scrollWidth : document.body.clientWidth + "px"');else{var c,d;a&&a.constructor=== 17 | Array?(c=a[0]?"number"===typeof a[0]?a[0].toString():a[0].replace(/px/,""):e.css("top").replace(/px/,""),c=-1===c.indexOf("%")?c+' + (t = document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop) + "px"':parseInt(c.replace(/%/,""))+' * ((document.documentElement.clientHeight || document.body.clientHeight) / 100) + (t = document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop) + "px"',a[1]&&(d="number"===typeof a[1]? 18 | a[1].toString():a[1].replace(/px/,""),d=-1===d.indexOf("%")?d+' + (t = document.documentElement.scrollLeft ? document.documentElement.scrollLeft : document.body.scrollLeft) + "px"':parseInt(d.replace(/%/,""))+' * ((document.documentElement.clientWidth || document.body.clientWidth) / 100) + (t = document.documentElement.scrollLeft ? document.documentElement.scrollLeft : document.body.scrollLeft) + "px"')):(c='(document.documentElement.clientHeight || document.body.clientHeight) / 2 - (this.offsetHeight / 2) + (t = document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop) + "px"', 19 | d='(document.documentElement.clientWidth || document.body.clientWidth) / 2 - (this.offsetWidth / 2) + (t = document.documentElement.scrollLeft ? document.documentElement.scrollLeft : document.body.scrollLeft) + "px"');f.removeExpression("top");f.removeExpression("left");f.setExpression("top",c);f.setExpression("left",d)}}})},focus:function(a){var h=this,a=a&&-1!==b.inArray(a,["first","last"])?a:"first",e=b(":input:enabled:visible:"+a,h.d.wrap);setTimeout(function(){0c?c:bc?c:this.o.minHeight&&"auto"!==i&&ed?d:ad?d:this.o.minWidth&&"auto"!==c&&fb||f>a?"auto":"visible"});this.o.autoPosition&&this.setPosition()},setPosition:function(){var a,b;a=g[0]/2-this.d.container.outerHeight(!0)/2;b=g[1]/2-this.d.container.outerWidth(!0)/2;var e="fixed"!==this.d.container.css("position")?l.scrollTop():0;this.o.position&&"[object Array]"===Object.prototype.toString.call(this.o.position)?(a=e+(this.o.position[0]||a),b=this.o.position[1]||b): 24 | a=e+a;this.d.container.css({left:b,top:a})},watchTab:function(a){if(0