په جینکنز کې د SQL سرور اتومات کول: پایله په ښکلي ډول بیرته راګرځول

بیا د تنظیم موضوع ته دوام ورکول د صفر ټچ پروډ د RDS لاندې. راتلونکي DBAs به ونشي کولی په مستقیم ډول د PROD سرورونو سره وصل شي ، مګر د کارولو وړ به وي جینکنز د محدودو عملیاتو لپاره دندې. DBA دنده پیلوي او یو څه وخت وروسته د دې عملیاتو بشپړیدو راپور سره یو لیک ترلاسه کوي. راځئ چې کاروونکو ته د دې پایلو وړاندې کولو لارې وګورو.

په جینکنز کې د SQL سرور اتومات کول: پایله په ښکلي ډول بیرته راګرځول

ساده متن

راځئ چې د خورا کوچني سره پیل وکړو. لومړی میتود خورا ساده دی چې واقعیا د خبرو کولو لپاره هیڅ شی شتون نلري (لیکوال له دې وروسته د فری سټایل دندې کاروي):

په جینکنز کې د SQL سرور اتومات کول: پایله په ښکلي ډول بیرته راګرځول

sqlcmd یو څه کوي او موږ یې کارونکي ته وړاندې کوو. د مثال په توګه، بیک اپ دندو لپاره مثالی:

په جینکنز کې د SQL سرور اتومات کول: پایله په ښکلي ډول بیرته راګرځول

په لاره کې مه هېروئ، چې د RDS بیک اپ / بیا رغونه غیر متناسب ده، نو تاسو اړتیا لرئ چې انتظار وکړئ:

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 سرور کې یوه مسخره پوښتنه شتون لري چې د وروستي N دقیقو لپاره CPU ښکاره کوي - دا معلومه شوه چې ملګری میجر هرڅه په یاد لري! دا کوئز هڅه وکړئ:

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

اوس، د دې فارمیټ په کارولو سره ($ ټوټه متغیر)

<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 سرور اتومات کول: پایله په ښکلي ډول بیرته راګرځول

هو، ښاغلی د تخریب په اړه ډیر څه پوهیږي! دا په زړه پورې ده چې دا کوډ لري: پاورشیل (په دې کې لیکل شوی)، SQL، Xquery، HTML. دا د افسوس خبره ده چې موږ نشو کولی جاوا سکرپٹ په HTML کې اضافه کړو (ځکه چې دا د لیکلو لپاره دی) ، مګر د پایتون کوډ پالش کول (کوم چې په SQL کې کارول کیدی شي) د هرچا دنده ده!

د SQL پروفایلر ټریس محصول

دا روښانه ده چې ټریس به د TextData ساحې له امله په CSV کې مناسب نه وي. مګر په لیک کې د ټریس گرډ ښودل هم عجیب دي - دواړه د اندازې له امله او ځکه چې دا معلومات ډیری وختونه د نورو تحلیلونو لپاره کارول کیږي. له همدې امله ، موږ لاندې کار کوو: موږ له لارې زنګ وهو 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 - ما مخکې د دې پورته مثال ورکړ. هو، دا به هم ښه وي چې په TextData کې د ثبات ماسک کړئ:

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

موږ د 999 څخه ډیر اوږده شمیرې په 0 سره بدلوو، او موږ د یو حرف څخه اوږد تارونه د "str" ​​سره بدلوو. له 9 څخه تر XNUMX پورې شمیرې اکثرا د بیرغونو په توګه کارول کیږي، او موږ دوی ته لاس نه ورکوو، همدارنګه د خالي او واحد حروف تارونه - 'Y'، 'N'، او نور اکثرا د دوی په مینځ کې موندل کیږي.

راځئ چې زموږ په ژوند کې یو څه رنګ اضافه کړو (په کلکه 18+)

په جدولونو کې، تاسو ډیری وختونه غواړئ هغه حجرې روښانه کړئ چې پاملرنې ته اړتیا لري. د مثال په توګه، ناکامي، د ټوټې ټوټې کولو لوړه کچه، او داسې نور. البته، دا په خلاص SQL کې ترسره کیدی شي، د PRINT په کارولو سره 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>

پخپله پوښتنه کې به موږ یو ډمي کالم اضافه کړو سمدستي مخکې کالم موږ رنګ کول غواړو. کالم باید وبلل شي SQLmarkup-یو څه:

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

Add a comment