Pag-usab . Ang umaabot nga mga DBA dili makakonektar direkta sa mga PROD server, apan magamit Jenkins mga trabaho alang sa limitado nga hugpong sa mga operasyon. Ang DBA naglunsad og trabaho ug human sa pipila ka panahon nakadawat og sulat nga adunay report sa pagkompleto niini nga operasyon. Atong tan-awon ang mga paagi sa pagpresentar niini nga mga resulta ngadto sa tiggamit.

Plain nga Teksto
Magsugod ta sa pinakawalay hinungdan. Ang una nga pamaagi yano ra kaayo nga wala’y bisan unsa nga hisgutan (ang tagsulat pagkahuman naggamit mga trabaho sa FreeStyle):

sqlcmd naghimo ug usa ka butang ug among gipresentar kini sa tiggamit. Maayo alang, pananglitan, mga backup nga trabaho:

Ayaw kalimti, sa paagi, nga sa ilawom sa RDS backup / restore kay asynchronous, mao nga kinahanglan nimo nga hulaton kini:
declare @rds table
(id int, task_type varchar(128), database_name sysname, pct int, duration int,
lifecycle varchar(128), taskinfo varchar(max) null,
upd datetime, cre datetime,
s3 varchar(256), ovr int, KMS varchar(256) null)
waitfor delay '00:00:20'
insert into @rds exec msdb.dbo.rds_task_status @db_name='{db}'
select @xid=max(id) from @rds
again:
waitfor delay '00:00:02'
delete from @rds
insert into @rds exec msdb.dbo.rds_task_status @db_name='{db}'
# {db} substituted with db name by powershell
select @stat=lifecycle,@info=taskinfo from @rds where id=@xid
if @stat not in ('ERROR','SUCCESS','CANCELLED') goto againIkaduha nga pamaagi, CSV
Ang tanan dinhi yano ra usab:

Bisan pa, kini nga pamaagi magamit lamang kung ang datos nga gibalik sa CSV "yano". Kung sulayan nimo nga ibalik, pananglitan, usa ka lista sa TOP N CPU nga intensive nga mga pangutana sa ingon niini nga paagi, ang CSV "makadaot" tungod sa kamatuoran nga ang teksto sa pangutana mahimong adunay bisan unsang mga karakter - mga koma, mga kinutlo, ug bisan mga linya sa linya. Busa, nagkinahanglan kita og usa ka butang nga mas komplikado.
Nindot nga mga karatula sa HTML
Hatagan ko ka dayon og code snippet
$Header = @"
<style>
TABLE {border-width: 1px; border-style: solid; border-color: black; border-collapse: collapse;}
TH {border-width: 1px; padding: 3px; border-style: solid; border-color: black; background-color: #6495ED;}
TD {border-width: 1px; padding: 3px; border-style: solid; border-color: black;}
</style>
"@
$Result = invoke-Sqlcmd -ConnectionString $jstr -Query "select * from DbInv" `
| Select-Object -Property * -ExcludeProperty "ItemArray", "RowError", "RowState", "Table", "HasErrors"
if ($Result -eq $null) { $cnt = 0; }
elseif ($Result.getType().FullName -eq "System.Management.Automation.PSCustomObject") { $cnt = 1; }
else { $cnt = $Result.Rows.Count; }
if ($cnt -gt 0) {
$body = "<h2>My table</h2>"
$Result | ConvertTo-HTML -Title "Rows" -Head $header -body $body `
| Out-File "res.log" -Append -Encoding UTF8
} else {
"<h3>No data</h3>" | Out-File "res.log" -Append -Encoding UTF8
}Pinaagi sa dalan, pagtagad sa linya uban sa System.Management.Automation.PSCustomObject, kini mao ang salamangka kon adunay eksaktong usa ka linya sa grid, unya ang pipila ka mga problema mitungha. Ang solusyon gikuha gikan sa Internet nga walay daghang pagsabot. Ingon usa ka sangputanan, makuha nimo ang format nga output sama niini:

Pagdrowing og mga graph
Pasidaan: kinky code sa ubos!
Adunay usa ka kataw-anan nga pangutana sa SQL server nga nagpakita sa CPU sa katapusang N nga mga minuto - kini nahimo nga si Comrade Major nahinumdom sa tanan! Sulayi kini nga quiz:
DECLARE @ts_now bigint = (SELECT cpu_ticks/(cpu_ticks/ms_ticks)
FROM sys.dm_os_sys_info WITH (NOLOCK));
SELECT TOP(256)
DATEADD(ms, -1 * (@ts_now - [timestamp]), GETDATE()) AS [EventTime],
SQLProcessUtilization AS [SQLCPU],
100 - SystemIdle - SQLProcessUtilization AS [OtherCPU]
FROM (SELECT record.value('(./Record/@id)[1]', 'int') AS record_id,
record.value('(./Record/SchedulerMonitorEvent/SystemHealth/SystemIdle)[1]', 'int')
AS [SystemIdle],
record.value('(./Record/SchedulerMonitorEvent/SystemHealth/ProcessUtilization)[1]', 'int')
AS [SQLProcessUtilization], [timestamp]
FROM (SELECT [timestamp], CONVERT(xml, record) AS [record]
FROM sys.dm_os_ring_buffers WITH (NOLOCK)
WHERE ring_buffer_type = N'RING_BUFFER_SCHEDULER_MONITOR'
AND record LIKE N'%<SystemHealth>%') AS x) AS y
ORDER BY 1 DESC OPTION (RECOMPILE);Karon, gamita kini nga pag-format ($Fragment variable)
<table style="width: 100%"><tbody><tr style="background-color: white; height: 2pt;">
<td style="width: SQLCPU%; background-color: green;"></td>
<td style="width: OtherCPU%; background-color: blue;"></td>
<td style="width: REST%; background-color: #C0C0C0;"></td></tr></tbody>
</table>Mahimo natong maporma ang lawas sa sulat:
$Result = invoke-Sqlcmd -ConnectionString $connstr -Query $Query `
| Select-Object -Property * -ExcludeProperty `
"ItemArray", "RowError", "RowState", "Table", "HasErrors"
if ($Result.HasRows) {
foreach($item in $Result)
{
$time = $itemEventTime
$sqlcpu = $item.SQLCPU
$other = $itemOtherCPU
$rest = 100 - $sqlcpu - $other
$f = $fragment -replace "SQLCPU", $sqlcpu
$f = $f -replace "OtherCPU", $other
$f = $f -replace "REST", $rest
$f | Out-File "res.log" -Append -Encoding UTF8
}Nga tan-awon sama niini:

Oo, daghang nahibal-an si Monsieur bahin sa mga kahiwian! Makapainteres nga kini nga code adunay: Powershell (gisulat niini), SQL, Xquery, HTML. Usa ka kaluoy nga dili kami makadugang sa Javascript sa HTML (tungod kay kini alang sa pagsulat), apan ang pagpasinaw sa Python code (nga mahimong gamiton sa SQL) mao ang katungdanan sa tanan!
Ang output sa pagsubay sa SQL profiler
Klaro nga ang pagsubay dili mohaum sa CSV tungod sa natad sa TextData. Apan ang pagpakita sa usa ka pagsubay sa grid sa usa ka sulat talagsaon usab - tungod sa gidak-on ug tungod kay kini nga datos kanunay nga gigamit alang sa dugang nga pagtuki. Busa, atong buhaton ang mosunod: kita motawag pinaagi sa invoke-SqlCmd usa ka piho nga script, sa giladmon nga kini nahimo
select
SPID,EventClass,TextData,
Duration,Reads,Writes,CPU,
StartTime,EndTime,DatabaseName,HostName,
ApplicationName,LoginName
from ::fn_trace_gettable ( @filename , default ) Sunod, sa higala server, nga ma-access sa DBA, adunay usa ka Traces database nga adunay walay sulod nga template, usa ka Model table, nga andam modawat sa tanan nga gitakda nga mga kolum. Atong kopyahon kini nga modelo ngadto sa usa ka bag-ong table nga adunay talagsaon nga ngalan:
$dt = Get-Date -format "yyyyMMdd"
$tm = Get-Date -format "hhmmss"
$tableName = $srv + "_" + $dt + "_" + $tm
$copytab = "select * into " + $tableName + " from Model"
invoke-SqlCmd -ConnectionString $tstr -Query $copytab Ug karon mahimo namong isulat ang among pagsubay niini gamit Data.SqlClient.SqlBulkCopy - Nakahatag na ako og usa ka pananglitan niini sa ibabaw. Oo, maayo usab nga mag-mask sa mga kanunay sa TextData:
# mask data
foreach ($Row in $Result)
{
$v = $Row["TextData"]
$v = $v -replace "'([^']{2,})'", "'str'" -replace "[0-9][0-9]+", '999'
$Row["TextData"] = $v
}
Among ilisan ang mga numero nga sobra sa usa ka karakter ang gitas-on sa 999, ug among ilisan ang mga kuwerdas nga mas taas kay sa usa ka karakter sa 'str'. Ang mga numero gikan sa 0 hangtod 9 sagad gigamit ingon nga mga bandera, ug wala namo kini hikapa, ingon man ang walay sulod ug usa ka karakter nga mga kuwerdas - 'Y', 'N', ug uban pa sagad makita sa taliwala nila.
Atong dugangan ug kolor ang atong kinabuhi (striktong 18+)
Sa mga lamesa, kanunay nimo gusto nga i-highlight ang mga cell nga nanginahanglan atensyon. Pananglitan, FAILS, taas nga lebel sa fragmentation, etc. Siyempre, mahimo kini sa hubo nga SQL, paghimo og HTML gamit ang PRINT, ug pag-set sa tipo sa file sa HTML sa Jenkins:
declare @body varchar(max), @chunk varchar(max)
set @body='<font face="Lucida Console" size="3">'
set @body=@body+'<b>Server name: '+@@servername+'</b><br>'
set @body=@body+'<br><br>'
set @body=@body+'<table><tr><th>Job</th><th>Last Run</th><th>Avg Duration, sec</th><th>Last Run, Sec</th><th>Last Status</th></tr>'
print @body
DECLARE tab CURSOR FOR SELECT '<tr><td>'+name+'</td><td>'+
LastRun+'</td><td>'+
convert(varchar,AvgDuration)+'</td><td>'+
convert(varchar,LastDuration)+'</td><td>'+
case when LastStatus<>'Succeeded' then '<font color="red">' else '' end+
LastStatus+
case when LastStatus<>'Succeeded' then '</font>' else '' end+
+'</td><td>'
from #j2
OPEN tab;
FETCH NEXT FROM tab into @chunk
WHILE @@FETCH_STATUS = 0
BEGIN
print @chunk
FETCH NEXT FROM tab into @chunk;
END
CLOSE tab;
DEALLOCATE tab;
print '</table>'
Ngano nga gisulat ko ang ingon nga code?

Apan adunay mas nindot nga solusyon. Convert Sa-HTML wala magtugot kanato sa pagkolor sa mga selula, apan mahimo nato kini human sa kamatuoran. Pananglitan, gusto namong mopili og mga cell nga adunay lebel sa pagkabahin nga labaw sa 80 ug labaw pa sa 90. Magdugang ta og mga estilo:
<style>
.SQLmarkup-red { color: red; background-color: yellow; }
.SQLmarkup-yellow { color: black; background-color: #FFFFE0; }
.SQLmarkup-default { color: black; background-color: white; }
</style>Sa pangutana mismo magdugang kami og dummy column diha-diha dayon kolum nga gusto namong koloran. Ang kolum kinahanglan nga tawagan SQLmarkup-usa ka butang:
case
when ps.avg_fragmentation_in_percent>=90.0 then 'SQLmarkup-red'
when ps.avg_fragmentation_in_percent>=80.0 then 'SQLmarkup-yellow'
else 'SQLmarkup-default'
end as [SQLmarkup-1],
ps.avg_fragmentation_in_percent, Karon, nga nakadawat sa HTML nga gihimo sa Powershell, atong tangtangon ang dummy column gikan sa header, ug sa lawas sa data atong ibalhin ang bili gikan sa column ngadto sa estilo. Gihimo kini nga adunay duha lamang ka pagpuli:
$html = $html `
-replace "<th>SQLmarkup[^<]*</th>", "" `
-replace "<td>SQLmarkup-(.+?)</td><td>",'<td class="SQLmarkup-$1">'
Resulta:

Dili ba kini elegante? Bisan tuod dili, kini nga pagkolor nagpahinumdom kanako sa usa ka butang

Source: www.habr.com
