جینکنز میں ایس کیو ایل سرور کا آٹومیشن: نتیجہ خوبصورتی سے واپس کرنا

ایک بار پھر ترتیب کے تھیم کو جاری رکھنا زیرو ٹچ PROD RDS کے تحت. مستقبل کے DBAs براہ راست PROD سرورز سے منسلک نہیں ہو سکیں گے، لیکن استعمال کر سکیں گے۔ جینکنز کاموں کے ایک محدود سیٹ کے لیے نوکریاں۔ ڈی بی اے کام شروع کرتا ہے اور کچھ عرصے بعد اس آپریشن کی تکمیل کی رپورٹ کے ساتھ ایک خط موصول ہوتا ہے۔ آئیے ان نتائج کو صارف کے سامنے پیش کرنے کے طریقے دیکھتے ہیں۔

جینکنز میں ایس کیو ایل سرور کا آٹومیشن: نتیجہ خوبصورتی سے واپس کرنا

سادہ متن

آئیے سب سے معمولی سے شروع کرتے ہیں۔ پہلا طریقہ اتنا آسان ہے کہ اس کے بارے میں بات کرنے کے لیے واقعی کچھ نہیں ہے (مصنف اس کے بعد فری اسٹائل جابز استعمال کرتا ہے):

جینکنز میں ایس کیو ایل سرور کا آٹومیشن: نتیجہ خوبصورتی سے واپس کرنا

sqlcmd کچھ کرتا ہے اور ہم اسے صارف کے سامنے پیش کرتے ہیں۔ مثال کے طور پر، بیک اپ جابز کے لیے مثالی:

جینکنز میں ایس کیو ایل سرور کا آٹومیشن: نتیجہ خوبصورتی سے واپس کرنا

یہ نہ بھولیں کہ 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

یہاں سب کچھ بہت آسان ہے:

جینکنز میں ایس کیو ایل سرور کا آٹومیشن: نتیجہ خوبصورتی سے واپس کرنا

تاہم، یہ طریقہ صرف اس صورت میں کام کرتا ہے جب 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 والی لائن پر دھیان دیں، یہ جادوئی ہے، اگر گرڈ میں بالکل ایک لائن ہے، تو کچھ مسائل پیدا ہوئے۔ زیادہ سمجھے بغیر اس کا حل انٹرنیٹ سے نکال لیا گیا۔ نتیجے کے طور پر، آپ کو آؤٹ پٹ فارمیٹ کچھ اس طرح ملے گا:

جینکنز میں ایس کیو ایل سرور کا آٹومیشن: نتیجہ خوبصورتی سے واپس کرنا

ڈرائنگ گراف

انتباہ: کنکی کوڈ نیچے!
ایس کیو ایل سرور پر ایک مضحکہ خیز استفسار ہے جو آخری 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);

اب، اس فارمیٹنگ کا استعمال کرتے ہوئے ($Fragment متغیر)

<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، Xquery، HTML۔ یہ افسوس کی بات ہے کہ ہم جاوا اسکرپٹ کو HTML میں شامل نہیں کر سکتے (چونکہ یہ لکھنے کے لیے ہے)، لیکن Python کوڈ کو پالش کرنا (جو 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 )  

اگلا، پر دوست ڈی بی اے کے ذریعہ قابل رسائی سرور پر، ایک خالی ٹیمپلیٹ کے ساتھ ایک ٹریس ڈیٹا بیس ہے، ماڈل پلیٹ، تمام مخصوص کالموں کو قبول کرنے کے لیے تیار ہے۔ ہم اس ماڈل کو ایک منفرد نام کے ساتھ ایک نئے ٹیبل پر کاپی کرتے ہیں:

$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، اعلیٰ سطح کے ٹکڑے وغیرہ۔ یقینا، یہ ننگے ایس کیو ایل میں کیا جا سکتا ہے، پرنٹ کا استعمال کرتے ہوئے ایچ ٹی ایم ایل تیار کرنا، اور جینکنز میں فائل کی قسم کو ایچ ٹی ایم ایل پر سیٹ کرنا:

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

میں نے ایسا کوڈ کیوں لکھا؟

جینکنز میں ایس کیو ایل سرور کا آٹومیشن: نتیجہ خوبصورتی سے واپس کرنا

لیکن اس سے بھی زیادہ خوبصورت حل ہے۔ کنورٹ ٹو 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 `
  -replace "<th>SQLmarkup[^<]*</th>", "" `
  -replace "<td>SQLmarkup-(.+?)</td><td>",'<td class="SQLmarkup-$1">'

نتیجہ:
جینکنز میں ایس کیو ایل سرور کا آٹومیشن: نتیجہ خوبصورتی سے واپس کرنا

کیا یہ خوبصورت نہیں ہے؟ اگرچہ نہیں، یہ رنگ مجھے کچھ یاد دلاتا ہے۔
جینکنز میں ایس کیو ایل سرور کا آٹومیشن: نتیجہ خوبصورتی سے واپس کرنا

ماخذ: www.habr.com

نیا تبصرہ شامل کریں