Anda di halaman 1dari 8

Membuat grafik penggunaan Web server secara on-line

I Made Wiryana

-----------------------------------------------------------------------Artikel ini merupakan saduran dari Linux Journal edisi Agustus 1998, Creating Web plots on demand, oleh Mark Pruett, dan diberikan keterangan tambahan seperlunya oleh penulis. ------------------------------------------------------------------------

Seringkali untuk keperluan mengelola Web server dibutuhkan suatu perangkat bantu untuk memonitor aktifitas pengaksesan server. Hal ni dibutuhkan untuk mengetahui saat-saat kapan server mengalami pengaksesan yang tinggi (peak) dan saat kapan terjadi pengaksesan yang rendah.Sehingga dapat diputuskan bilamana harus menambah kapasitas web server, atau bilamana dapat melakukan proses back-up atau perawatan secara otomatis- Ini semua dapat dilakukan dengan beragam program penganalis web-log, seperti analog, ataupun www-stat. Akan tetapi sering kali diinginkan suatu plot yang cukup representatif dan secara intuitif menggambarkan beban kerja web server. Lazimnya plot tersebut berupa grafik 2 dimensi dengan sumbu y merepresentasikan jumlah akses, dan sumbu x merepresntasikan waktu. Untuk kebutuhan tersebut dapat dibuat suatu program yang bekerja dan dijalankan melalui browser (jadi berbentuk program cgi), dan menampilkan hasilnya yang dapat dilihat langsung pada browser. Dengan beberapa perangkat bantu yang biasanya telah disertakan dalam distribusi Linux dapat dibuat program tersebut dengan mudah. Pada dasarnya program ini akan melakukan :
l

l l

Membaca file access_log dari Web Server, biasanya terletak di /var/log/httpd/access_log pada distribusi Red Hat. Atau file /var/log/httpd.acccess.log pada distribusi SuSE. Kemudian menghitung akses yang dilakukan user tiap menit/jam pada hari tertentu. Kemudian mengkonversikan data hingga dapat diolah oleh pembuat grafik plot. Membuat grafik dengan memanfaatkan paket program gnuplot. Mengkonversi grafik dengan menggunakan paket NetPBM sehingga dapat diubah menjadi format gif, dan dapat ditampilkan pada Web page. Mengirim html-page yang menampilkan grafik tersebut

Langkah tersebut dapat dilakukan dengan suatu skrip Perl yang sederhana. Yang akan diterangkan satu persatu di bawah ini.

Membaca file log


Untuk membaca file log dapat dilakukan dengan mudah dengan cara membaca file log tersebut secara langsung. Biasanya file log tersebut berisi data seperti di bawah ini :

141.20.100.156 - - [17/Jan/1999:02:23:25 +0100] "GET /made HTTP/1.0" 301 193 141.20.100.156 - - [17/Jan/1999:02:23:25 +0100] "GET /made/ HTTP/1.0" 200 14123 195.141.225.107 - - [17/Jan/1999:02:33:34 +0100] "GET /made/artikel/cluster/cluster_s.jpg H 134.157.13.165 - - [17/Jan/1999:04:26:27 +0100] "GET /made/artikel/Abad21 HTTP/1.0" 301 208 202.158.24.74 - - [17/Jan/1999:09:01:21 +0100] "GET /majalah HTTP/1.1" 301 208

Menurut dokumentasi Apache Web Server, bila Apache Web Server diinstalasi dengan konfigurasi standard, maka log file tersebut akan ditulis mengikuti format standard Common Log File (CLF) yaitu :
host ident authuser date request status bytes

Jadi pada contoh di atas, setiap baris file log tersebut berisi :
l l

l l l

Alamat IP pengakses Identifikasi user, yang pada contoh di atas tidak diisi(-), dapat digunakan bila perlu dengan memanfaatkan mekanisme identd Autentikasi, pada contoh di atas tidak diisi (-), ini akan diisi bila untuk dokumen yang menggunakan password. File yang diakses dengna rotokol HTTP yang digunakan Status pengakasesan yang dikirimkan ke client user. Besar data yang ditransfer dalam byte.

Sehingga untuk mengetahui jumlah pengkases setiap hari, dapat dibuat sebuah skrip sederhana yang akan mengekstrak jumlah akses setiap menit pada hari yang sama. Cara ini dilakukan pada bagian program di bawah ini:
open (LOGFILE, "< $logfile"); while () { if ($_ =~ /\[$date/) { if ($_ =~ m/^.+\[(.+)\].+$/) { ($indate, $inhour, $inmin, $stuff) = split (":", $1); $hr_percent = ($inmin/60) * 100; $accesses[$inhour * 100 + $hr_percent]++; $total++; } } } close LOGFILE;

Skrip di atas akan menghitung jumlah akses pada suatu hari (hari yang sama). Pada hari yang sesuai maka jam, dam menit diekstrak dari file data dan ditempatkan dalam variabel $inhour dan $inmin. Sekarang yang menjadi pertanyaan adalah, diinginkan suatu grafik y vs x, nilai apakah yang akan dituliskan pada x, sudah barang tentu kita menginginkan garis waktu dari jam 00:00 hingga 24:00, tetapi karena hanya ada 60 menit maka perlu dilakukan penyesuaian agar gambar dapat berbentuk garis kontinyu. Menit yang berisi nilai 0...59 akan diskala menjadi 0...99 sehingga dapat membentuk plot yang kontinyu. Dengan cara ini maka nilai 1:30 pm akan diubah menjadi 1350. Setiap membaca nilai, maka akan dimasukkan kedalam array $accesses[...], pada nilai dari array ini akan dinaikkan bila ada pengaksesan pada jam yang sama. Sebab waktu akses digunakan sebagai index array yang selalu dinaikkan satu bila ada pengakasesan pada waktu yang sama.

Membuat grafik akses


Untuk memplot grafik, pada lingkungan Unix dapat digunakan dengan mudah sebuah paket program, yaitu gnuplot. Biasanya pada distribusi Linux telah disertakan program ini. Untuk mengetahui apakah anda telah memiliki paket program ini di sistem anda dapat dilakukan dengan cara
$ which gnuplot /usr/bin/gnuplot

Yang akan dijawab dengan path letak program binary gnuplot. Bila tidak ada, maka gnuplot

haruslah diinstal terlebih dahulu. Untuk keterangan detail mengenai program gnuplot ini dapat dilakukan dengan.
$ man gnuplot

gnuplot adalah paket program untuk memplot yang bersifat device independent . Sehingga output yang dihasilkan dapat diberikan pada berbagai jenis keluaran misal beragam jenis file, display, printer dan sebagainya. Program gnuplot ini telah tersedia sejak lama untuk berbagai jenis platform Unix. Paket ini memiliki "bahasa" tersendiri yang mendukung pembuatan plot 2 ataupun 3 dimensi. Perintah dapat diberikan secara interaktif satu persatu, ataupun dimasukkan dalam suatu file skrip dan dijalankan sebagai suatu batch job. Gnuplot ini mendukung divais keluaran yang sangat bermanfaat yaitu Xwindows. Gnuplot dapat dijalankan dari xterm dan hasilnya langsung ditampilkan pada Windows yang terpisah. Cara ini merupakan mekanisme yang baik untuk mempelajari perintah-perintah gnuplot , terutama bagi para pemula yang sedang mempelajari perintah-perintah gnuplot. Karena gnuplot dapat membaca perintah dari file skrip dan membaca data dari file teks, maka paket ini merupakan paket yang cocok untuk menghasilkan grafik secara real-timeketika ada permintaan oleh web server. Untuk membuat plot. langkah pertama yang dilakukan program adalah memasukkan data yang akan ditampilkan ke dalam suatu file teks yang namanya ditentukan oleh variabel $datafile. Bagian program yang melakukan hal ini adalah
open (DATAFILE, "> $datafile"); for ($i=0; $i <= 2400; $i++) { if (defined ($accesses[$i])) { printf (DATAFILE "%04d\t%d\n", $i, $accesses[$i]); } else { printf (DATAFILE "%04d\t0\n", $i); } } close DATAFILE;

Setiap data dari array $accesses[...] dituliskan secara berpasangan, dengan indeksnya. Ini berarti akan membuat grafik 2 dimensi dimana pada x, adalah indeks waktu akses, dan y adalah jumlah akses pada saat tersebut (nilainya adalah dalam elemen array $accesses[x] ). Sehingga nilai pada file tersebut akan berisi 2401 data yang berpasangan sebagai contoh seperti di bawah ini
0808 0809 0810 0811 1 0 3 12

Yang perlu diperhatikan adalah data ketika tidak ada akses harus diisi dengan bilangan nol. Ini dilakukan setelah memasukkan data kemudian dilakukan pengujian kepada tiap element, bila isi $accesses[$i] tidak terdefinisikan (tidak ada), maka harus diisi dengan nol. Sedangkan perintah untuk menentukan format plot dilakukan pada bagian program di bawah ini
for ($i=0; $i <=24; $i++) { if ($i == 12) { $xtics = sprintf ("%s\"%s\" %d,", $xtics, "Noon", $i*100); } else {

$xtics = sprintf ("%s\"%02d\" %d,", $xtics, $i, $i*100); } } chop $xtics; open (GPFILE, "> $gpfile"); # Setelah baris dengan EOM berisi perintah untuk # gnuplot print GPFILE <<EOM; set term pbm color set offsets set nolog set nopolar set border set grid set title "Web Server Accesses for $mon $day, $year" set xlabel "Time (Hours)" set ylabel "Number of Hits" set size 1.10, 0.50 set xtics ($xtics) plot '$datafile' title "" with lines EOM close GPFILE;

gnuplot secara otomatis akan memberi label pada sumbu x, dan sumbu y dengan berpatokan pada nilai data. Jika data memiliki nilai maksimum 48, maka secara otomatis akan dibuat penanda sumbu (tick ) yaitu 0, 10, 20, 30, 40 dan 50. Hal ini sudah cukup memadai untuk nilai y yang digunakan, tetapi kurang cocok untuk sumbu x, karena sumbu x berisi tanda waktu pengaksesan. Untuk menghilangkan label otomatis pada sumbu x ini, maka dilakukan pada looping pertama. Pada looping di bagian pertama seksi di atas, dilakukan penulisan label yang digunakan.gnuplot menghasilkan plot sesuai dengan perintah yang diberikan. Pada dasarnya gnuplot hanya memiliki dua perintah dasar untuk memplot data yaitu plot dan splot . Perintah lainnya yang digunakan dalam program ini adalah set , yang digunakan untuk menghidupkan atau mematikan option tertentu. Misal perintah di bawah ini:
set title "Web Server Access $mon $day, $year"

Perintah di atas akan menulis judul dari grafik plot yang dibuat. Semua perintah ini ditulis dalam suatu file dengan mengguakan perintah skrip perl yaitu :
print GPFILE<<EOM; set ... set ... . . EOM

Perintah tersebut pada Perl akan menuliskan semua baris di bawah <<EOM dan melakukan penggantian variabel hingga baris EOM. Perintah set term pbm color dibutuhkan untuk menset jenis keluaran. Dalam hal ini ditentukan sebagai file pbm, karena ingin diconvert ke gif dan berwarna. Perintah lainnya dapat dilihat pada manual gnuplot. Sedangkan yang penting adalah perintah membaca data dari $datafile . Setelah skrip ini terbentuk maka siap untuk dijalankan sewaktu-waktu.

Mengubah format dari pbm ke gif


Untuk mengubah format pbm ke gif, maka digunakan tools Netpbm yaitu pbmtogif . Harap diperiksa

apakah sistem telah memiliki perangkat bantu ini.


$ which ppmtogif /usr/bin/ppmtogif

Program ppmtofif akan membaca file ppm dan mengkonversinya menjadi file gif. Pada program di atas digunakan pemanggilan sistem oleh program PERL yaitu dilakukan pada :
system ("$GNUPLOT $gpfile | $PPMTOGIF 2> /dev/null > " ."$httproot/$imagedir/$giffile"); unlink ($gpfile, $datafile);

Pada bagian program tersebut, maka program gnuplot akan membaca file perintah dan hasilnya akan diberikan kepada program ppmtogif melalui stdout. Kemudian keluaran hasil konfersi akan disimpan ke dalam suatu file GIF yang ditentukan namanya oleh $giffile (yang selalu berubah setiap eksekusi program).

Mengeluarkan hasil plot


Untuk menampilkan hasil grafik pada browser, maka harus dilakukan dengan mengirimkan tag yang bersisi nama file yang telah dihasilkan. Ini dilakukan pada bagian
print "Content-type: text/html\n\n"; print <<EOM; <HTML> <BODY bgcolor=#FFFFFF> <TITLE>Web Access <h3>Web Accesses of nakula.rvs.uni-bielefeld.de Total Accesses: $total <IMG SRC=/web_plot/$imagedir/$giffile> </BODY> </HTML> EOM

Lain-lain
Beberapa hal yang bersifat kosmetik ditambahkan pada program ini yaitu
l

Untuk menambah fasilitas program ini, misal user dapat memasukkan plot dibuat untuk saat kapan (diberikan melalui tanggal) yaitu dengan cara seperti di bawah ini:
http://mesinku.com/cgi-bin/web_plot.cgi?12/Jan/1999

Maka program akan mencetak data akses server pada tanggal 12 Januari 1999. Bila tidak diberikan parameter tersebut, maka program akan mencetak data pengaksesan server pada hari ini. Hal ini dilakukan pada bagian 3 dari program utama.
l

Setiap kali program dijalankan maka akan dilakukan pembuatan sebuah image GIF baru, sehingga file ini harus dihapus bila telah tidak dibutuhkan. Ini dapat dilakukan dengan mudah, yaitu dengan menggunakan crontab yang akan menghapus data setiap malam.

Program skrip lengkap

Di bawah ini diberikan program skrip yang lengkap dan dibawahnya adalah salah satu contoh grafik yang dihasilkan oleh program ini.
#! /usr/bin/perl #------------------------------------------------------# BAGIAN 1: #Menentukan variabel untuk lokasi dan nama file #------------------------------------------------------$logfile = "/var/log/httpd/access_log"; $httproot = "/home/httpd/html/web_plot"; $imagedir = "images"; $datafile = "/tmp/gnuplot_$$.dat"; $gpfile = "/tmp/gnuplot_$$.gp"; $giffile = "gnuplot_$$.gif"; $GNUPLOT = "gnuplot"; $PPMTOGIF = "ppmtogif"; #------------------------------------------------------# BAGIAN 2: # # Membaca tanggal saat ini dan menyesaikan format agar # sama dengan format pada file access log #------------------------------------------------------if ($ENV{"QUERY_STRING"} =~ /[0-9]+/) { ($day, $mon, $year) = split ("/", $ENV{"QUERY_STRING"}); } else { $datestr = `date`; chop $datestr; ($dow, $mon, $day, $hour, $min, $sec, $zone, $year) = split (/[ ]+|:/, $datestr); } $date = sprintf ("%02d/%s/%d", $day, $mon, $year); #------------------------------------------------------# BAGIAN 3: # # Menghitung jumlah akses pada hari tertentu # Nilai diskala dari (0..59) menjadi (0..99). # Sehingga gnuplot dapat memplot grafik kontinyu. #------------------------------------------------------open (LOGFILE, "< $logfile"); while () { if ($_ =~ /\[$date/) { if ($_ =~ m/^.+\[(.+)\].+$/) { ($indate, $inhour, $inmin, $stuff) = split (":", $1); $hr_percent = ($inmin/60) * 100; $accesses[$inhour * 100 + $hr_percent]++; $total++; } } } close LOGFILE; #------------------------------------------------------# BAGIAN 4: # # Menulis file data yang akan digunakan oleh gnuplot #------------------------------------------------------open (DATAFILE, "> $datafile"); for ($i=0; $i <= 2400; $i++) { if (defined ($accesses[$i])) {

printf (DATAFILE "%04d\t%d\n", $i, $accesses[$i]); } else { printf (DATAFILE "%04d\t0\n", $i); } } close DATAFILE; #------------------------------------------------------# BAGIAN 5: # # Menulis file perintah untuk gnuplot. #------------------------------------------------------# Mendefinisikan penanda sumbu x for ($i=0; $i <=24; $i++) { if ($i == 12) { $xtics = sprintf ("%s\"%s\" %d,", $xtics, "Noon", $i*100); } else { $xtics = sprintf ("%s\"%02d\" %d,", $xtics, $i, $i*100); } } chop $xtics; open (GPFILE, "> $gpfile"); # Semua yang tertulis setelah bari ini hingga EOM # mendefinisikan isi file perintah gnuplot print GPFILE <<EOM; set term pbm color set offsets set nolog set nopolar set border set grid set set set set set title "Web Server Accesses for $mon $day, $year" xlabel "Time (Hours)" ylabel "Number of Hits" size 1.10, 0.50 xtics ($xtics)

plot '$datafile' title "" with lines EOM close GPFILE; #------------------------------------------------------# BAGIAN 6: # # Menjalankan gnuplot dan menkonversi menjadi gif #------------------------------------------------------system ("$GNUPLOT $gpfile | $PPMTOGIF 2> /dev/null > " ."$httproot/$imagedir/$giffile"); unlink ($gpfile, $datafile); #------------------------------------------------------# BAGIAN 7: # # Menghasilkan sebuah HTML page yang menampilkan # grafik yang baru dibuat. #-------------------------------------------------------

print "Content-type: text/html\n\n"; print <<EOM; <HTML> <BODY bgcolor=#FFFFFF> <TITLE>Web Access <h3>Web Accesses of nakula.rvs.uni-bielefeld.de</h3> Total Accesses: <b>$total</b><p> <IMG SRC=/web_plot/$imagedir/$giffile><p> </BODY> </HTML> EOM

Variasi program
Program ini bisa dikembangkan misal dengan mencatat jumlah byte yang ditransfer dalam satu hari, atau sebaran user yang mengakses dengan melihat ke field-field yang berbeda. Untuk variasi lainnya dapat dimanfaatkan dengan cara mengubah file log yang akan dihasilkan oleh Web serverApache.

Anda mungkin juga menyukai