Automation sa SQL server sa Jenkins: nindot nga ibalik ang resulta

Pag-usab pagpadayon sa tema sa kahikayan Zero Touch PROD ubos sa RDS. 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.

Automation sa SQL server sa Jenkins: nindot nga ibalik ang resulta

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):

Automation sa SQL server sa Jenkins: nindot nga ibalik ang resulta

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

Automation sa SQL server sa Jenkins: nindot nga ibalik ang resulta

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 again

Ikaduha nga pamaagi, CSV

Ang tanan dinhi yano ra usab:

Automation sa SQL server sa Jenkins: nindot nga ibalik ang resulta

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:

Automation sa SQL server sa Jenkins: nindot nga ibalik ang resulta

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:

Automation sa SQL server sa Jenkins: nindot nga ibalik ang resulta

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?

Automation sa SQL server sa Jenkins: nindot nga ibalik ang resulta

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:
Automation sa SQL server sa Jenkins: nindot nga ibalik ang resulta

Dili ba kini elegante? Bisan tuod dili, kini nga pagkolor nagpahinumdom kanako sa usa ka butang
Automation sa SQL server sa Jenkins: nindot nga ibalik ang resulta

Source: www.habr.com

Pagpalit kasaligan nga pag-host alang sa mga site nga adunay proteksyon sa DDoS, mga server sa VPS VDS 🔥 Pagpalit og kasaligang website hosting nga adunay proteksyon sa DDoS, VPS VDS servers | ProHoster