目次


カスタム・スクリプトを使用した、サーバー・リソース使用状況の継続的モニタリング

Comments

前提条件

PHP を使って作成されたカスタム・モニタリング・データ・コレクター・スクリプトは、サーバーから実行されるように意図されています。このスクリプトが Linux ターゲット・システムに接続して、(プロセッサー、RAM、HDD、およびネットワークの) 使用状況のモニタリング・データを抽出します。この手法によるデータ収集を正常に機能させるには、以下の条件を満たす必要があります。

  • 2 台の Linux サーバー/仮想マシン (VM)/Docker
  • 最新バージョンの PHP がインストールされていること
  • データベース・インスタンス (例えば、MariaDB)
  • データベース・クライアント

この記事で紹介するモニタリング・スクリプトに変更を加えれば、ターゲット・システムから随時、任意のタイプのリソース使用状況データを収集することができます。

カスタム・スクリプトによるモニタリング手法の概要

この手法で必要となる主要なコンポーネントは、モニタリング・データ・コレクター (1 つ以上) と、レシーバーとしてのサーバー、VM、または Docker です。データ・コレクターは cron ジョブ内で (例えば 15 分間隔で) モニタリング・データを抽出するスクリプトを実行します。15 分ごとに実行されるこのスクリプトは、ターゲット・システム (モニタリング対象のサーバーのリスト) に接続し、(その時点でのプロセッサー、メモリー、ディスク、ネットワークの) リソース使用状況データを取得します。取得されたデータは .csv ファイルに書き込まれて圧縮されます。したがって15 分ごとに、3 つのファイル (プロセッサーとメモリーに関するファイル、ディスクに関するファイル、ネットワークに関するファイル) が作成されて、それらのファイルがレシーバーにアップロードされます。

レシーバーは別のデータ処理スクリプトと DB インスタンスを実行し、その DB インスタンスのテーブルにモニタリング・データを格納します。レシーバーが実行するスクリプトによって、ファイルが抽出されて処理され、該当するテーブルにファイル内のデータが書き込まれるという仕組みです。詳細については、図 1 に示すブロック図を参照してください。

図 1. 複数のデータ・コレクターからのモニタリング・データ抽出の概要を示すブロック図
図 2. 詳細なブロック図 - 単一のデータ・コレクターからのモニタリング・データの抽出

モニタリング対象のサーバー (ターゲット・システム) のリストを作成して維持する

データ・コレクターとして実行されるモニタリング・データ抽出スクリプトには、モニタリング対象とするサーバーのリストが (入力として) 必要です。このリストはデータベース・テーブル内に維持されます。このテーブルのソースは、ビジネス・シナリオに基づいて決定する必要があります。

論理上、テーブルのソースは、組織で使用している有効なすべてのリソースに関するリアルタイムのデータが含まれる、サーバー・ディスカバリーまたはインベントリー・ソリューションでなければなりません。ただし、場合によっては、特定の重要なサーバー・リソースをモニタリングするというビジネス・シナリオであることも考えられます。

いずれにしても、このテーブルには以下の列が必要です。

  • 行のシリアル番号
  • サーバーのシリアル番号
  • ホスト名
  • IP アドレス
  • タイプ
  • プラットフォーム
  • オペレーティング・システム
  • ロケーション

学習目的でこのスクリプトをテストする場合、またはスクリプトをさらにカスタマイズすることを予定している場合は、テーブルを手作業で作成して、サンプル・データを入力として取り込んでください。

データ・コレクターからターゲット・システムへの SSH 鍵ベースの接続を有効にする

セキュア・シェル (SSH) は、オープンソースの極めて信頼性の高いネットワーク・プロトコルです。SSH を使用することで、リモートから Linux サーバー (ターゲット・システム) にログインしてコマンドを実行できるだけでなく、SCP (Secure Copy Protocol) を使ってコンピューター間でファイルを転送することもできます。

次のステップは、Linux オペレーティング・システムで稼働するデータ・コレクター (サーバーまたは VM) を特定することです。データ・コレクターから特定した Linux ターゲット・システムに、SSH プロトコルに基づいてパスワードを使わずにログインできるようにする必要があります。こうすることによって、モニタリング・スクリプトがターゲット・システムに接続し、モニタリング・データを抽出するためのコマンドを実行することが可能になります。

データ・コレクターからターゲット・システムへの SSH 鍵ベースの接続を有効にするには、以下の手順を実行する必要があります。

  • (モニタリング・スクリプトを実行できる場所から) 任意のユーザー名を使用してデータ・コレクターにログインします。
  • ssh-keygen -t rsa コマンドを実行して公開鍵のペアを生成します。
  • データ・コレクターから SSH を使用して、共通ホスト名を指定してターゲット・システムに接続し、ターゲット・システムに .ssh ディレクトリーを作成します。
    ssh <共通ユーザー名>@<ターゲット・システムの IP> mkdir -p .ssh
  • データ・コレクターから SSH を使用して、すべてのターゲット・システムの <共通ユーザー名> の .ssh ディレクトリーに、コレクターの SSH 公開鍵を authorized_keys という名前のファイルとしてアップロードします。
    cat .ssh/id_rsa.pub | ssh <共通ユーザー名>@<ターゲット・システムの IP> 'cat >> .ssh/authorized_keys'
  • 注意する点として、データ・コレクターとターゲット・システムの間で、SSH のバージョンが異なる場合があります。そのため、以下のコマンドを使用して、.ssh ディレクトリーと authorized_keys ファイルに対するアクセス権を設定します。
    ssh <共通ユーザー名>@<ターゲット・システムの IP> "chmod 700 .ssh; chmod 640 .ssh/authorized_keys"

注: すべてのターゲット・システムへの接続について単一の <共通ユーザー名> を使用してください。こうすることで、モニタリング・スクリプトはあらゆるターゲット・システムに 1 つの共通した ssh <ユーザー名>@<ターゲット・システムの IP> コード行を使用して接続し、リモートからコマンドを実行できるようになります。

データ・コレクターおよびレシーバー上にモニタリング・データ用のディレクトリーを作成する

データ・コレクター上には、モニタリング・データ抽出スクリプトによって 15 分ごとに生成される 3 つの .zip ファイルのそれぞれを保管するための 3 つのディレクトリー (それぞれ「cpumem」、「disk」、「network」という名前) が必要です。これら 3 つのタイプのファイルは生成された後にレシーバーにアップロードされるため、レシーバー上にもこれらのファイルを受け取って処理対象として保管する、同様の 3 つのディレクトリーを作成します。

レシーバー・スクリプトは、ファイルを抽出して処理し、ファイルのデータを該当するモニタリング・データ・テーブル (プロセッサー用、メモリー用、ディスクおよびネットワーク用の合計 3 つのテーブル) に書き込みます。

レシーバー上にモニタリング・データ・テーブルを作成する

15 分ごとに、データ・レシーバー・スクリプトはファイルのデータをデータベース・テーブルに書き込みます。テーブルも同じく 3 つ必要です (プロセッサーおよびメモリー使用状況に関するテーブル、ディスク使用状況のテーブル、ネットワーク使用状況のテーブル)。これら 3 つのテーブルの構造は、以下のように設計します。

プロセッサーとメモリーの使用状況データを保管するテーブルに推奨される列は以下のとおりです。

  • 行のシリアル番号
  • サーバーのシリアル番号
  • ホスト名
  • CPU のアイドル率
  • CPU の使用率
  • 利用可能な合計メモリー
  • 空きメモリー
  • 使用中メモリー
  • メモリーの空き率
  • メモリーの使用率
  • タイム・スタンプ

ディスク使用状況データを保管するテーブルに推奨される列は以下のとおりです。

  • 行のシリアル番号
  • サーバーのシリアル番号
  • マウント・ポイント
  • 使用率
  • タイム・スタンプ

ネットワーク使用状況データを保管するテーブルに推奨される列は以下のとおりです。

  • 行のシリアル番号
  • サーバーのシリアル番号
  • インターフェース名
  • インターフェースのタイプ
  • 使用率
  • タイム・スタンプ

データ・コレクター上で実行されるモニタリング・データ抽出スクリプトの概要

データ抽出をモニターする以下の PHP コードを参照してください。コードの内容が自明になるように、コメントを追加してあります。

/*Code Goes Here*/
<?php
$record_time= date("Y-m-dXH:i:s", time());
$record_time1=date("Y-m-d-H-i-s",time());

/*Include the DB connection code script*/
include '/var/www/html/consqlp.php';
$ssql="select id, name,function from <discovery-or-inventory-table> where platform='x'";
$result=$conn->query($ssql);
$count=0;
$myf="mon-cpumem-$record_time1";
$myfile="$myf.csv";
$heading="server_id,server_name,current_server_datetime,start_time,cpu_percent_idle,cpu_percent_used,mem_total,mem_free,mem_used,mem_cached,mem_percent_free,mem_percent_available,mem_percent_used/n";
$fh=fopen($myfile,"w"); 
fwrite($fh,"");
fclose($fh);
$myfd="mon-disk-$record_time1";
$myfiled="$myfd.csv";
$fhd=fopen($myfiled,"w");
fwrite($fhd,"");
fclose($fhd);
$myfn="mon-network-$record_time1";
$myfilen="$myfn.csv";
$fhn=fopen($myfilen,"w");
fwrite($fhn,"");
fclose($fhn);

/* For each server from the "To be monitored table", fetch CPU, memory, and network  utilization and write them to three .csv files */ 
foreach ($result as $row) {
		$server_id=$row['id'];
 		$server_name=trim(strtolower(($row['name'])));
 		$server_type=$row['function'];
 		if (isset($server_name)) {
 				$server_name=$server_name;
 				}
 		if($server_name == "" ) {
 				exit;
 				}
 		$server_name=strtolower($server_name);
 		$up = ping($server_name);
 		if($up == NULL) {
 				continue; 
 				} 
 		$cmdd="sudo ssh $server_name hostname -s";
 		$output = strtolower(trim(shell_exec($cmdd)));
 		if ($output<>$server_name) {
 				exit;
 				}

        #Get current time on server so same unit can be used for all entries in database 
	    $cmdd="sudo ssh $server_name 'date ".'"'."+%Y-%m-%d %H:%M:%S".'"'."'";
 		$current_server_datetime = trim(shell_exec($cmdd));
 		$time1 = strtotime($current_server_datetime);
 		$time1 = $time1 - (20 * 60);
 		$date1 = date("Y-m-d H:i:s", $time1);
 		$date1_split=explode(' ',$date1);
 		$start_time=array_pop($date1_split);

 		//Get CPU and Memory data, call relevant function
 		$cpu_percent_idle=getCpuUsage($server_name,$start_time);
 		$cpu_percent_used= 100 - intval($cpu_percent_idle);
 		$memory_usage=getMemoryUsage($server_name,$start_time);

 	    //Format CPU and memory data and write to a file, call relevant functions
 		$memory_details=explode(",",$memory_usage);
 		$mem_free=intval($memory_details[0]);
 		$mem_used=intval($memory_details[1]);
 		$mem_cached=intval($memory_details[2]);
 		$mem_total=$mem_free+$mem_used;
 		$mem_percent_free=($mem_free/$mem_total)*100;
 	$mem_percent_available=(($mem_free+$mem_cached)/ $mem_total)*100;
 		$mem_percent_used=($mem_used/$mem_total)*100;
 	$data="$server_sno,$server_name,$cpu_percent_idle,$cpu_percent_used,$mem_total,$mem_free,$mem_used,$mem_percent_free,$mem_percent_use,$current_server_datetime/n";
 		$fh1=fopen($myfile,"a");
 		fwrite($fh1,$data);
 		fclose($fh1);
 
 		//Get disk utilization data, call relevant function
 		getDiskUsage($server_name,$start_time,$server_id,$myfiled); 
 
 		//Get network utilization data, call relevant function
 		$storageNetwork=getStorageNetwork($server_name);
 	    getNetworkUtlization($server_name,$server_id,$storageNetwork,$start_time,'data',	$myfilen);
 	    getBridgeUtilizations($server_name,$start_time,$server_id,$myfilen);
  		$count++;
  		}

/*Zip the text file created for CPU & Memory utilization data*/
$zip = new ZipArchive;
$res = $zip->open("$myf.zip", ZipArchive::CREATE);
if ($res === TRUE) {
		$zip->addFile($myfile);
		$zip->close();
		} else {
 		echo 'zip-failed';
		}

/*Zip the text file created for disk utilization data*/
$zipd = new ZipArchive;
$resd = $zipd->open("$myfd.zip", ZipArchive::CREATE);
if ($resd === TRUE) {
		$zipd->addFile($myfiled);
		$zipd->close();
		} else {
 		echo 'zip-failed';
		}

/*Zip the text file created for network utilization data*/
$zipn = new ZipArchive;
$resn = $zipn->open("$myfn.zip", ZipArchive::CREATE);
if ($resn === TRUE) {
		$zipn->addFile($myfilen);
		$zipn->close();
		} else {
 		echo 'zip-failed';
		}

/*copy the zip files to the receiver and delete them*/
$remote_file_url = "<Receiver-address>:/var/www/html/monitoring-data/cpumem";
$remote_file_urld = "<Receiver-address>:/var/www/html/monitoring-data/disk";
$remote_file_urln = "<Receiver-address>:/var/www/html/monitoring-data/network";
#New file name and path for this file
$local_file = "/root/$myf.zip";
$local_filed = "/root/$myfd.zip";
$local_filen = "/root/$myfn.zip";
#Copy the CPU & Mem utilization file from data collector to receiver 
$copy = "scp $local_file $remote_file_url";
$c=1;
a:
$copystatus=shell_exec("$copy 2>&1"); 
#echo "Here is - $copystatus";
#If not copied try after 5 minutes
if($copystatus!="") {
		echo "SCP ERROR:Have to be retried/n";
		$c++;
		if ($c<=3) {
 			sleep(300);
 			goto a;
 			} 
		$cmdmove1="mv $myf.zip /var/www/html/monitoring-data/Failed/cpumem/";
 		shell_exec($cmdmove1);
		}
#Copy the disk utilization file from data collector to receiver 
$copyd = "scp $local_filed $remote_file_urld";
$c1=1;
b:
$copystatusd=shell_exec("$copyd 2>&1");
#echo "Here is - $copystatus";
#If not copied try after 5 minutes
if($copystatusd!="") {
		echo "SCP ERROR:Have to be retried/n";
		$c1++;
		if ($c1<=3) {
 			sleep(300);
 			goto b;
 			}
		$cmdmove1d="mv $myfd.zip /var/www/html/monitoring-data/Failed/disk/";
		shell_exec($cmdmove1d);
 		}
#Copy the network utilization file from data collector to receiver 
$copyn = "scp $local_filen $remote_file_urln";
$c1=1;
c:
$copystatusn=shell_exec("$copyd 2>&1");
if($copystatusn!="") {
		echo "SCP ERROR:Have to be retried/n";
		$c1++;
		if ($c1<=3) {
			sleep(300);
			goto c;
 			}
		$cmdmove1n="mv $myfn.zip /var/www/html/monitoring-data/Failed/network/";
		shell_exec($cmdmove1d);
		}

/*delete the zip file(s) once copied to the receiver*/
$cmddel="rm -rf $myf.zip";
shell_exec($cmddel);
$cmddeld="rm -rf $myfd.zip";
shell_exec($cmddeld);
$cmddeln="rm -rf $myfn.zip";
shell_exec($cmddeln);

/*Function definitions*/
// 1) SAR (System Activity Report) command in Linux is used to collect,report & save CPU,Memory, Network utilization
// 2) Here, the script connects to target systems via ssh and executes SAR command
//Function to connect to target system and extract CPU utilization data

function getCpuUsage($server_name,$start_time) {
#This 1-line code will successfully connect to target systems one by one without password and execute commands
	$cmdd="sudo ssh $server_name sar -p -s $start_time | grep Average | tail -n1"; $output = 	trim(shell_exec($cmdd));
	if($output=="") {
		exit;
 		}
	$result_array = explode(' ', $output);
	$cpu_usage_percent = intval(array_pop($result_array)); 
	return($cpu_usage_percent);
	} 

//Function to connect to target system and extract Memory utilization data
function getMemoryUsage($server_name,$start_time) {
	$cmdd="sudo ssh $server_name sar -r -s $start_time | grep Average | tail -n1";
	$output = removeExtraSpaces(trim(shell_exec($cmdd)));
	$result_array = explode(' ', $output);
	return("$result_array[1],$result_array[2],$result_array[5]"); 
	}

//Function to connect to target system and extract disk utilization data, format (mount-point wise) data and write to a .csv file
function getDiskUsage($server_name,$start_time,$server_id,$myfiled) { 
	global $current_server_datetime;
	global $record_time;
	global $record_time1;
	$cmdd="sudo ssh $server_name sar -d -s $start_time | grep Average";
	$output = (trim(shell_exec($cmdd)));
	$disk_array=explode("/n",$output);
	foreach ($disk_array as $disk_line) {
		$disk_line=trim(str_replace("Average:"," ",$disk_line));
		$disk_line=removeExtraSpaces($disk_line);
		$disk_line_values=explode(' ',$disk_line);
		$mount-point=$disk_line_values[0];
		$percent_utilization=intval($disk_line_values[8]);
	$datad="$server_sno,$mount-point,$percent_utilization,$current_server_datetime/n";
		$fh1d=fopen($myfiled,"a");
		fwrite($fh1d,$datad);
		fclose($fh1d); 
		}
}

//Function to connect to target system and extract network utilization data, format (interface wise) data and write to a .csv file
function getNetworkUtlization($server_name,$server_id,$interface_type,$start_time,$interface_name,$myfilen) {
	global $conn;
	global $current_server_datetime;
	global $record_time;
	$cmdd="sudo ssh $server_name sar -n DEV -s $start_time | grep $network_type | grep 	Average | tail -n1";
	$output = shell_exec($cmdd);
	$result_array=explode(" ",$output);
	$storage_network_utilization=trim(end($result_array));
	if ($storage_network_utilization<>"") {
		if (intval($storage_network_utilization) > 100) {
		$storage_network_utilization=100;
		}
	$datan="$server_sno,$interface_name,$interface_type,$storage_network_utilization,	$record_time/n";
	$fh1n=fopen($myfilen,"a");
	fwrite($fh1n,$datan);
	fclose($fh1n); 
	}
}

function getBridgeUtilizations($server_name,$start_time,$server_id,$myfilen) {
	global $conn;
	global $current_server_datetime;
	global $record_time;
	$bridge_array=explode("/n",getBridgeNames($server_name));
	$grep_string="";
	foreach ($bridge_array as $bridge_name) {
		$bridge_name=trim(str_replace("auto ","",$bridge_name));
		$grep_string.= "$bridge_name ".'/|';
		}
	$grep_string=trim(substr($grep_string,0,strlen($grep_string)-2));
	$result="";
	if ($grep_string <> "") {
	$cmdd="sudo ssh $server_name sar -n DEV -s $start_time | grep Average | grep '$grep_string' ";
		$output = trim(shell_exec($cmdd));
		$output=removeExtraSpaces($output);
		$output= strtolower($output);
		$bridges_all_utilization_array=explode("/n",trim($output));
foreach ($bridges_all_utilization_array as $bridge_each_utilization_array) {
$bridge_each_utilization_array=trim(str_replace("average:","",  $bridge_each_utilization_array));
$bridge_each_utilization_details=explode(" ",$bridge_each_utilization_array); $bridge_each_utilization_details_array=explode(".",current($bridge_each_utilization_details));
$bridge_name = trim(end($bridge_each_utilization_details_array));
		$vlan_id=str_replace('br','',$bridge_name);
$bridge_usage = trim(end($bridge_each_utilization_details));$datan1="$server_id,$bridge_name,bridge,$vlan_id,$bridge_usage,$record_time/n";
$fh2n=fopen($myfilen,"a");
fwrite($fh2n,$datan1);
fclose($fh2n);
			}
		}
	}

function getBridgeNames($server_name) {
	$cmdd="sudo ssh $server_name cat /etc/network/interfaces | grep auto | grep '/.'";
	$output = shell_exec($cmdd);
	return(trim($output));
	}

function getStorageNetwork($server_name) {
	$storage_net="";
$cmdd="sudo ssh $server_name ip a | grep '10.0.0/|10.0.2/|10.0.4/|10.0.5'";
	$output = shell_exec("$cmdd");
	$output_array=explode(" ",$output);
	$storage_net = trim(end($output_array));
	return($storage_net);
	}

//Function called while formatting to remove extra black spaces from the extracted data before writing it to the file
function removeExtraSpaces($my_string) {
	$my_string=str_replace(" "," ",$my_string);
	$my_string=str_replace(" "," ",$my_string);
	$my_string=str_replace(" "," ",$my_string);
	return($my_string);
	}

//Function called to check if all servers in the "to be monitored" data table are responding for ping request if its source is not the discovery solution
function ping($host) {
exec(sprintf('ping -c 1 -W 5 %s', escapeshellarg($host)), $res, $rval);
	return $rval === 0;
	}

function appendfile($file,$strline) {
	file_put_contents($file, $strline, FILE_APPEND );
	}

function convert_seconds($uptime) {
	$dt1 = new DateTime("@0");
	$dt2 = new DateTime("@$uptime");
return $dt1->diff($dt2)->format('%a days-%h hours-%i minutes-%s seconds');
	}
exit;
?>

上記のコードによって、(15 分間隔で) 以下の 3 つのファイルが作成されます。

  • mon-cpumem-<現在のタイム・スタンプ>.zip
  • mon-disk-<現在のタイム・スタンプ>.zip
  • mon-network-<現在のタイム・スタンプ>.zip

レシーバー上で実行されるモニタリング・データ・レシーバー・スクリプトの概要

レシーバー・ノードで受信したモニタリング・データを処理する以下の PHP コードを参照してください。コードの内容が自明になるように、コメントを追加してあります。.csv ファイルのタイプごとに 1 つのスクリプトのインスタンスが実行されなければなりません (受信するファイルに、cpumemdisknetwork の 3 つのタイプがある場合、タイプごとに 1 つのスクリプトのインスタンス、つまり合計 3 つのインスタンスが cron ジョブとして実行される必要があります)。

/*Code Goes Here*/


<?php

/*Include the DB connection code script*/
include '/var/www/html/info/consqlp.php';
$findfile="find /var/www/html/monitoring-data/cpumem/ -cmin +0 -cmin -15 -name *.zip";
$latestzipfile=shell_exec($findfile);
$split=explode("\n",$latestzipfile);
for ($i=0;$i<count($split)-1;$i++) {
	$temp=$split[$i];
	if($temp == "" ) {
		exit;
 		}
	$namesplit=explode('/',$temp);
	$fullfilename=array_pop($namesplit);
	$onlyfilename=substr($fullfilename,0,strpos($fullfilename,'.'));

/*Unzip the received file, process the .csv file and write to table. Here the script handles only CPU and Memory utilization data*/
	$zip = new ZipArchive;
$zip1=$zip->open("/var/www/html/monitoring-data/cpumem/$onlyfilename.zip");
	var_dump($zip1);
	if ($zip1 === true) {
		$zip->extractTo('/var/www/html/monitoring-data/cpumem/');
		$zip->close();
  		//Delete the .zip file after unzipping it
unlink("/var/www/html/monitoring-data/cpumem/$onlyfilename.zip");
 		} else {
 		echo "failed\n";
 		}

//Read the file and write the contents to the CPU & Memory utilization data table
$handle = fopen("/var/www/html/monitoring-data/cpumem/$onlyfilename.csv", "r");
	// loop over rows in data file
	while (($data = fgetcsv($handle,",")) !== FALSE) {
		// trim the first column
		$data[0] = trim($data[0]);
$SQL="insert into <cpumem-utilization-data-table>(ServerSNo,server_name,cpu_percent_idle,cpu_percent_used,mem_total,mem_free,mem_used,mem_percent_free,mem_percent_used,timestamp)values('$data[0]','$data[1]','$data[4]','$data[5]','$data[6]','$data[7]','$data[8]','$data[10]','$data[12],'$data[2]')";
// insert into database
$result=$conn->query($SQL);
}
fclose($handle);
}
?>

MariaDB または MySQL の DB 接続コードとして、以下の PHP コードが DB 接続を作成します。

/*Code Goes Here*/

<?php
$servername = "<Receiver-address>";
$username = "<DB-hostname>";
$password = "<DB-password>";
$db_database ="<DB-name>";
try {
$conn = new PDO("mysql:host=$servername;dbname=$db_database", $username, $password);
	// set the PDO error mode to exception
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
	}
catch(PDOException $e) {
	echo "Connection failed: " . $e->getMessage();
	}
?>

まとめ

この記事では、環境内でのサーバー使用状況をモニタリングするためのカスタム・ソリューションを計画して作成する方法を説明しました。このアーキテクチャーを参考にして別のスクリプトを作成することも、ビジネス要件に合わせてスクリプトを変更することもできます。あるいは、基本的なデータ収集を実行する特定のコードを、必要に応じてカスタマイズすることも可能です。


ダウンロード可能なリソース


コメント

コメントを登録するにはサインインあるいは登録してください。

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Linux
ArticleID=1051390
ArticleTitle=カスタム・スクリプトを使用した、サーバー・リソース使用状況の継続的モニタリング
publish-date=11022017