前
言
之前有過2篇關於如何監控ASP.NET core項目的文章,有興趣的也可以看看.
今天我們主要來介紹一下,如何使用Opserver監控我們的SQL Server 和ASP.NET項目的異常監控
監控效果如下:
SQL Server的:
ASP.NET異常情況的監控:
監控SQL Server
首先我們來講解一下如何監控我們的SQL Server.
上篇內容我們已經提到過 Opeserver的項目有很多的配置文件.
我們找到我們的SQLSettings.example.json文件,改名為SQLSettings.json文件
修改其中的配置項如下:
/* Configuration for the SQL Server dashboard */ { "defaultConnectionString": "", "refreshIntervalSeconds": 30, "clusters": [ { "name": "192.168.1.120", "refreshIntervalSeconds": 20, "nodes": [ { "name": "192.168.1.121" }, { "name": "192.168.1.122" }, { "name": "192.168.1.123" } ] } ], "instances": [ { "name": "實例名稱", "connectionString": "數據庫連接字符串", "refreshIntervalSeconds": 200 } ] }
解釋一下其中的意義,參照如下:
defaultConnectionString (默認的連接字符串,用於單台數據庫監控)
refreshIntervalSeconds (輪詢數據庫情況的刷新時間,如果不設置,默認為60秒)
instances (當有多台單獨的數據庫實例需要監控時候的數據庫實例設置)
clusters (當你的數據庫是集群部署的時候的設置)
后面的內容都一樣,我就不一一解釋了,多台數據庫實例,可以自行在instances 中添加多個節點,集群就在clusters中加入節點地址即可
然后,我們直接運行OpSever項目,就可以觀察到數據庫的變化情況了.
監控ASP.NET項目的異常情況
下面我們來講講如何監控我們的ASP.NET項目異常的情況
1.我們需要在在web項目中通過nuget安裝StackExchange.Exceptional組件(它依賴於dapper)
2.在web.config中的configSections節點下增加section節點 “Exceptional”,如下:
<configSections> <section name="Exceptional" type="StackExchange.Exceptional.Settings" /> </configSections>
3.在web.config中增加Exceptional節點,如下:
<Exceptional applicationName="應用名稱"> <!--<ErrorStore type="Memory" />--> <!--連接opserver數據庫時開啟--> <ErrorStore type="存儲類型" connectionString="連接字符串" /> </Exceptional>
ErrorStore 錯誤存儲有4種實現方式,Memory,JSON,SQL,MySQL,如下是官方的說明譯文:
<!--如果沒有設置ErrorStore,將默認使用內存的形式來記錄錯誤--> <!--<ErrorStore type="Memory" />--> <!-- 其他的存儲類型, 相關的設置屬性如下: - rollupSeconds:頁面上異常的更新秒數,默認為600秒 - backupQueueSize: 設置緩存多少錯誤,默認為1000條--> <!-- JSON:Size是設置Json存儲的文件數量,默認為200--> <!--<ErrorStore type="JSON" path="~/Errors" size="200" />--> <!-- SQL: 只需要設置數據庫連接字符串如下: --> <!--<ErrorStore type="SQL" connectionString="Server=.;Database=Exceptions;Uid=Exceptions;Pwd=myPassword!" />--> <!--<ErrorStore type="SQL" connectionStringName="MyConnectionString" />--> <!--你也可以設置為Mysql如下 --> <!--<ErrorStore type="MySQL" connectionString="Server=.;Database=Exceptions;Username=Exceptions;Pwd=myPassword!" />--> <!--<ErrorStore type="MySQL" connectionStringName="MyConnectionString" />-->
這里我們采用SQL的形式,直接存在數據庫里.
4.修改web.config的system.webServer節點,添加新的handlers,modules配置如下:
<system.webServer>
<validation validateIntegratedModeConfiguration="false" />
<handlers> <add name="Exceptional" path="exceptions.axd" verb="POST,GET,HEAD" type="StackExchange.Exceptional.HandlerFactory, StackExchange.Exceptional" preCondition="integratedMode" /> </handlers> <modules> <add name="ErrorLog" type="StackExchange.Exceptional.ExceptionalModule, StackExchange.Exceptional" /> </modules> </system.webServer>
5.因為我這里采用的SQL存儲,所以需要給數據庫添加存儲錯誤信息的表,SQL語句如下:
USE [OpServerTest] GO /****** Object: Table [dbo].[Exceptions] Script Date: 2016/11/16 16:28:56 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO SET ANSI_PADDING ON GO CREATE TABLE [dbo].[Exceptions]( [Id] [bigint] IDENTITY(1,1) NOT NULL, [GUID] [uniqueidentifier] NOT NULL, [ApplicationName] [nvarchar](50) NOT NULL, [MachineName] [nvarchar](50) NOT NULL, [CreationDate] [datetime] NOT NULL, [Type] [nvarchar](100) NOT NULL, [IsProtected] [bit] NOT NULL, [Host] [nvarchar](100) NULL, [Url] [nvarchar](500) NULL, [HTTPMethod] [nvarchar](10) NULL, [IPAddress] [varchar](40) NULL, [Source] [nvarchar](100) NULL, [Message] [nvarchar](1000) NULL, [Detail] [nvarchar](max) NULL, [StatusCode] [int] NULL, [SQL] [nvarchar](max) NULL, [DeletionDate] [datetime] NULL, [FullJson] [nvarchar](max) NULL, [ErrorHash] [int] NULL, [DuplicateCount] [int] NOT NULL, CONSTRAINT [PK_Exceptions] PRIMARY KEY CLUSTERED ( [Id] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] GO SET ANSI_PADDING OFF GO ALTER TABLE [dbo].[Exceptions] ADD DEFAULT ((0)) FOR [IsProtected] GO ALTER TABLE [dbo].[Exceptions] ADD DEFAULT ((1)) FOR [DuplicateCount] GO
6.最后回到OpServer項目修改ExceptionsSettings.example.json文件為ExceptionsSettings.json,並添加配置如下:
{ "stores": [ //異常日志存儲位置 { "name": "ExceptionDB", "queryTimeoutMs": 2000, "pollIntervalSeconds": 10, "connectionString": "錯誤存儲的地址" } ] }
7.想增加自定義的錯誤信息,可以編寫如下代碼:
try { throw new Exception("Just a try/catch test"); } catch (Exception ex) { // logged, but caught so we don't crash ErrorStore.LogExceptionWithoutContext(ex); }
這樣,異常也會記錄到存儲里面去了.
寫在最后
本篇到此結束,下篇介紹如何監控我們的服務器狀態