BDL 監視スクリプトを作成する

SunOS の「ps」など、BDL で特定のコマンド ライン ツールをリモートから実行するには、3 つの関数が必要です。

// hCon will be assigned the connection handle
function Connect(/*inout*/hCon : number; sHost : string)
begin
  WebTcpipConnect(hCon, sHost, 512);  
end Connect;

// Send a request to the remote execution server
// remote execution protocol: 
// What does a request look like in binary:
// 00username00password00shellCommandToExecute00
// What does the response look like
// 00responseData
// sample request:
//   00root00labpass00ps -ef | egrep -c ".*"00
function Request(hCon: number; sUser: string; sPwd: string;
               sCmd: string):number
var
  sSend : string;
  sBuf  : string;
  nSize : number;
  nRec  : number;
begin
  sSend := "\h00";
  SetString(sSend, 2, sUser);
  SetString(sSend, Strlen(sUser) + 3, sPwd);
  SetString(sSend, Strlen(sUser) + Strlen(sPwd) + 4, sCmd);
         
  nSize := 3 + Strlen(sUser) + Strlen(sPwd) 
             + Strlen(sCmd) + 1;
  
  WebTcpipSendBin(hCon, sSend, nSize);         
  WebTcpipRecvExact(hCon, NULL, 1);
  WebTcpipRecv(hCon, sBuf, sizeof(sBuf), nRec);
  Request := number(sBuf);
end Request;

// Closes the connection to the remote exec server
function Close(hCon : number)
begin
  WebTcpipShutdown(hCon);  
end Close;

Silk Performer MeasureInc の関数には、ラッパー関数が必要です。 この関数は、すべての監視プロジェクトで使用できます。 プロジェクト属性にアクセスするため、MonitorInc という名前の関数が作成されます。 この関数は、以前に指定した属性にアクセスします。

また、MonitorInc 関数を既存の bdh である bdlMonitor.bdh からインポートすることもできます。

function MonitorInc(nMon : number; nVal : number)
var
  sMeasure : string;
begin
  // This will check whether the attribute
  // "#BDLMonitor1.Enabled" was set to true
  if AttributeGetBoolean("#BDLMonitor" + string(nMon) 
                         + ".Enabled") then
      // If yes then let's read the name of the measure.
      // To do this we read the the project attribute
      // "#BDLMonitor1.Name" and store it 
      // to a local variable named sMeasure. 
      // sMeasure will have the value: 
      // "SunOs\Processes\CountNrOfProcesses"
      AttributeGetString("#BDLMonitor" + string(nMon) 
              + ".Name", sMeasure, sizeof(sMeasure));
      
      //   Set a new value for
      // "SunOs\Processes\CountNrOfProcesses"
      MeasureInc(sMeasure, nVal, MEASURE_KIND_AVERAGE);
    end;
end MonitorInc;

これで、定義されているすべての関数を使用してスナップショットを取得するトランザクションをコーディングすることができます。 また、このトランザクションは、プロジェクト ファイル属性にもアクセスします。 目標は、これらの属性を後から Performance Explorer で設定することです。 ただし、ここでは、スクリプトが機能することを確認するため、4 つの属性をプロジェクト属性に追加する必要があります。

注: 属性の名前は、大文字小文字が区別されます。

プロジェクト > プロジェクト属性を選択してプロジェクト属性エディタを開き、これらの追加属性を追加します。 これらは、パスワード型の属性パスワードを除いて、すべて文字列型です。 テストのため属性に値を割り当てます。 属性の目的を示す各属性の説明を選択します。

const
  nMeasure := 1;

dcluser  
  user
    VMonitor
  transactions
    TSnap : 1;

dclfunc
.... // your functions here

dcltrans
  transaction TSnap
  var
    hCon  : number init 0;
    sHost : string;
    sCmd  : string;
    sUser : string;
    sPwd  : string;
    nVal  : number;
  begin
    AttributeGetString("host", sHost, sizeof(sHost));
    AttributeGetString("command", sCmd, sizeof(sCmd));
    AttributeGetString("user", sUser, sizeof(sUser));
    AttributeGetString("password", sPwd, sizeof(sPwd));
    
    Connect(hCon, sHost);
    nVal := Request(hCon, sUser, sPwd, sCmd);
    MonitorInc(nMeasure, nVal);
    Close(hCon);      
  end TSnap;

これで、プロジェクトが新しく作成されたスクリプトによって構成されます。 プロジェクトを保存し、TryScript の実行を開始して、機能することを検証します。 nVal を印刷するかログ ファイルに書き込むことにより、スクリプトが機能することを検証します。 スクリプトが機能した場合は、プロジェクトを保存して閉じます。