جينڪنز ۾ SQL سرور جو آٽوميشن: نتيجو خوبصورت طور تي واپس ڪرڻ

ٻيهر ترتيب جي موضوع کي جاري رکڻ زيرو ٽچ PROD RDS تحت. مستقبل جي ڊي بي ايز سڌو سنئون PROD سرورز سان ڳنڍڻ جي قابل نه هوندا، پر استعمال ڪرڻ جي قابل هوندا جينکن نوڪريون آپريشن جي محدود سيٽ لاء. DBA نوڪري شروع ڪري ٿو ۽ ڪجهه وقت کان پوء هن آپريشن جي مڪمل ٿيڻ جي رپورٽ سان هڪ خط وصول ڪري ٿو. اچو ته انهن نتيجن کي صارف ڏانهن پيش ڪرڻ جا طريقا ڏسو.

جينڪنز ۾ SQL سرور جو آٽوميشن: نتيجو خوبصورت طور تي واپس ڪرڻ

سادي متن

اچو ته سڀ کان وڌيڪ معمولي سان شروع ڪريون. پهريون طريقو ايترو سادو آهي ته حقيقت ۾ ڳالهائڻ لاءِ ڪجهه به ناهي (ليکڪ هن کان پوءِ FreeStyle نوڪريون استعمال ڪري ٿو):

جينڪنز ۾ SQL سرور جو آٽوميشن: نتيجو خوبصورت طور تي واپس ڪرڻ

sqlcmd ڪجھ ڪري ٿو ۽ اسان ان کي استعمال ڪندڙ کي پيش ڪريون ٿا. مثالي، مثال طور، بيڪ اپ نوڪريون:

جينڪنز ۾ SQL سرور جو آٽوميشن: نتيجو خوبصورت طور تي واپس ڪرڻ

نه وساريو، رستي جي ذريعي، ته آر ڊي ايس جي بيڪ اپ / بحالي جي تحت غير مطابقت رکندڙ آهي، تنهنڪري توهان کي ان جو انتظار ڪرڻو پوندو:

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

ٻيو طريقو، CSV

هتي هر شيء بلڪل سادي آهي:

جينڪنز ۾ SQL سرور جو آٽوميشن: نتيجو خوبصورت طور تي واپس ڪرڻ

بهرحال، اهو طريقو صرف ڪم ڪري ٿو جڏهن CSV ۾ واپس ڪيل ڊيٽا "سادو" آهي. جيڪڏهن توهان واپس ڪرڻ جي ڪوشش ڪندا، مثال طور، TOP N CPU جي سخت سوالن جي هڪ فهرست هن طريقي سان، CSV "خراب" ٿي ويندي ان حقيقت جي ڪري ته سوال جي متن ۾ ڪي به اکر شامل ٿي سگهن ٿا - ڪاما، اقتباس، ۽ حتي لائين بريڪ. تنهن ڪري، اسان کي وڌيڪ پيچيده شيء جي ضرورت آهي.

HTML ۾ خوبصورت نشانيون

مان توهان کي فوري طور تي ڪوڊ جو ٽڪرو ڏيندس

$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
  }

رستي ۾، System.Management.Automation.PSCustomObject سان لڪير تي ڌيان ڏيو، اهو جادوگر آهي؛ جيڪڏهن گرڊ ۾ بلڪل هڪ لائن آهي، پوء ڪجهه مسئلا پيدا ٿيا. ان جو حل انٽرنيٽ تان ورتو ويو بغير گهڻي سمجھڻ کان. نتيجي طور، توھان حاصل ڪندا ٻاھر فارميٽ ڪجھ ھن طرح:

جينڪنز ۾ SQL سرور جو آٽوميشن: نتيجو خوبصورت طور تي واپس ڪرڻ

ڊرائنگ گراف

خبردار: ڪني ڪوڊ هيٺان!
SQL سرور تي هڪ عجيب سوال آهي جيڪو ڏيکاري ٿو CPU کي آخري N منٽن لاءِ - اهو ظاهر ٿيو ته ڪامريڊ ميجر کي سڀ ڪجهه ياد آهي! هي سوال آزمايو:

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

ھاڻي، ھن فارميٽنگ کي استعمال ڪندي ($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>

اسان خط جو جسم ٺاهي سگهون ٿا:

$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
    }

جيڪو هن طرح نظر ايندو:

جينڪنز ۾ SQL سرور جو آٽوميشن: نتيجو خوبصورت طور تي واپس ڪرڻ

ها، مونسيئر کي تمام گهڻو ڄاڻندو آهي خرابين بابت! اهو دلچسپ آهي ته هن ڪوڊ تي مشتمل آهي: Powershell (ان ۾ لکيل)، SQL، Xquery، HTML. اهو افسوس جي ڳالهه آهي ته اسان جاوا اسڪرپٽ کي HTML ۾ شامل نٿا ڪري سگهون (جيئن ته اهو لکڻ لاءِ آهي)، پر پٿون ڪوڊ پالش ڪرڻ (جيڪو SQL ۾ استعمال ٿي سگهي ٿو) هر ڪنهن جو فرض آهي!

SQL پروفائلر ٽريس آئوٽ

اهو واضح آهي ته اهو نشان CSV ۾ نه هوندو ڇاڪاڻ ته TextData فيلڊ جي ڪري. پر هڪ خط ۾ ٽريس گرڊ ڏيکارڻ به عجيب آهي - ٻئي سائيز جي ڪري ۽ ڇاڪاڻ ته هي ڊيٽا اڪثر ڪري وڌيڪ تجزيي لاءِ استعمال ڪيو ويندو آهي. تنهن ڪري، اسان هيٺيان ڪندا آهيون: اسان ذريعي سڏين ٿا invoke-SqlCmd هڪ خاص رسم الخط، جنهن جي کوٽائي ۾ اهو ڪيو ويو آهي

select 
  SPID,EventClass,TextData,
  Duration,Reads,Writes,CPU,
  StartTime,EndTime,DatabaseName,HostName,
  ApplicationName,LoginName
   from ::fn_trace_gettable ( @filename , default )  

اڳيان ، تي دوست DBA پاران دستياب سرور تي، هڪ خالي ٽيمپليٽ سان گڏ هڪ ٽريڪ ڊيٽابيس آهي، ماڊل پليٽ، سڀني مخصوص ڪالمن کي قبول ڪرڻ لاء تيار آهي. اسان هن ماڊل کي هڪ نئين ٽيبل تي هڪ منفرد نالي سان نقل ڪريون ٿا:

$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 

۽ ھاڻي اسان ان کي استعمال ڪندي پنھنجو نشان لکي سگھون ٿا Data.SqlClient.SqlBulkCopy - ان جو مثال مون مٿي ڏنو آهي. ها، اهو پڻ سٺو لڳندو ته ٽيڪسٽ ڊيٽا ۾ مستقل کي ماسڪ ڪرڻ:

# mask data
foreach ($Row in $Result)
{ 
  $v = $Row["TextData"]
  $v = $v -replace "'([^']{2,})'", "'str'" -replace "[0-9][0-9]+", '999'
  $Row["TextData"] = $v
}

اسان هڪ کان وڌيڪ اکر ڊگھا انگن کي 999 سان تبديل ڪندا آهيون، ۽ اسان هڪ اکر کان ڊگھا اسٽرنگ کي 'str' سان تبديل ڪندا آهيون. 0 کان 9 تائين جا انگ اڪثر ڪري جھنڊن طور استعمال ٿيندا آھن، ۽ اسين انھن کي ھٿ نه ٿا ھڻي سگھون، ان سان گڏوگڏ خالي ۽ واحد اکرن وارا اسٽرنگ - 'Y'، 'N' وغيره اڪثر انھن مان ملن ٿا.

اچو ته اسان جي زندگين ۾ ڪجهه رنگ شامل ڪريون (سختي سان 18+)

جدولن ۾، توھان اڪثر انھن سيلن کي نمايان ڪرڻ چاھيو ٿا جن کي ڌيان ڏيڻ جي ضرورت آھي. مثال طور، FAILS، اعلي سطحي ٽڪراء، وغيره. يقينن، اهو بيئر SQL ۾ ٿي سگهي ٿو، پرنٽ استعمال ڪندي HTML ٺاهي، ۽ جينڪنز ۾ HTML ۾ فائل جي قسم کي ترتيب ڏيو:

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>'

مون اهڙو ڪوڊ ڇو لکيو؟

جينڪنز ۾ SQL سرور جو آٽوميشن: نتيجو خوبصورت طور تي واپس ڪرڻ

پر اتي هڪ وڌيڪ خوبصورت حل آهي. HTML ۾ تبديل ڪريو اسان کي سيلز کي رنگ ڏيڻ نه ڏيندو آهي، پر اسان اهو ڪري سگهون ٿا حقيقت کان پوء. مثال طور، اسان 80 کان وڌيڪ ۽ 90 کان وڌيڪ ٽڪرن جي سطح سان سيلز کي چونڊڻ چاهيون ٿا. اچو ته انداز شامل ڪريو:

<style>
.SQLmarkup-red { color: red; background-color: yellow; }
.SQLmarkup-yellow { color: black; background-color: #FFFFE0; }
.SQLmarkup-default { color: black; background-color: white; }
</style>

خود سوال ۾ اسان هڪ ڊمي ڪالم شامل ڪنداسين فوري طور تي اڳ ڪالم جنهن کي اسان رنگ ڏيڻ چاهيون ٿا. ڪالمن کي سڏڻ گهرجي SQL مارڪ اپ-ڪجهه:

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, 

ھاڻي، پاور شيل پاران ٺاھيل HTML حاصل ڪرڻ کان پوء، اسان ھيڊر مان ڊمي ڪالمن کي هٽائي ڇڏينداسين، ۽ ڊيٽا جي باڊي ۾ اسان ڪالمن مان قدر کي انداز ۾ منتقل ڪنداسين. اهو صرف ٻن متبادلن سان ڪيو ويندو آهي:

$html = $html `
  -replace "<th>SQLmarkup[^<]*</th>", "" `
  -replace "<td>SQLmarkup-(.+?)</td><td>",'<td class="SQLmarkup-$1">'

نتيجو
جينڪنز ۾ SQL سرور جو آٽوميشن: نتيجو خوبصورت طور تي واپس ڪرڻ

ڇا اهو خوبصورت ناهي؟ جيتوڻيڪ نه، هي رنگ مون کي ڪجهه ياد ڏياريندو آهي
جينڪنز ۾ SQL سرور جو آٽوميشن: نتيجو خوبصورت طور تي واپس ڪرڻ

جو ذريعو: www.habr.com

تبصرو شامل ڪريو