You are on page 1of 10

Securitatea sistemelor informatice Note de laborator (L8)

http://scdsd.bluepink.ro contact: info3retele20072008@yahoo.com

Laborator 8

Descriere: Tehnologii de monitorizare. JMX.

Programa
1. Java Management Extensions

JMX este un API care a fost introdus in Java 2 Standard Edition incepand cu versiunea 5.0.

Tehnologia este folosita pentru monitorizarea resurselor precum: masina virtuala, aplicatii,
dispozitive sau servicii, in mod uzual prin:

configurarea si reconfigurarea aplicatiilor,


culegerea de statistici privind executia acestora
notificarea in caz de erori sau de schimbari de stare a aplicatiilor

JMX este similar cu SNMP (Simple Network Monitoring Protocol), dar numai conceptual.
Tehnologia este interoperabila cu SNMP, daca se foloseste un adaptor corespunzator. Initial folosit
pentru monitorizarea resurselor locale, JMX a fost extins si cu JMX Remote API, care adauga
capabilitati de apelare la distanta si suport pentru comunicare sigura folosind protocolul SSL.

Specificatiile JMX si JMX Remote API pot fi gasite pe site-ul Sun, la:
http://java.sun.com/products/JavaManagement/download.html

2. Arhitectura JMX

Arhitectura JMX este urmatoarea:

2.1 JMX Agent

In centrul arhitecturii JMX se afla componenta JMX Agent care consta intr-un MBeanServer si un
set de conectori JMX. JMX Agent este cel care faciliteaza aplicatiei JMX Client accesul la
Retele de calculatoare II

resursele monitorizate. Aplicatia client si agentul JMX comunica prin intermediul unor conectori
JMX, care pot functiona peste diferite protocoale sau medii de transport.

2.2 MBeans

O aplicatie care se doreste a fi monitorizata trebui instrumentata conform specificatiei JMX. In


esenta, aceasta implica existenta a cel putin un obiect MBean (Managed Bean) care sa aiba acces la
structura aplicatiei (tipic, una sau mai multe din clasele aplicatiei implementeaza ele insele interfata
MBean).

MBean-urile (sunt specificate dupa modelul Java Beans) sunt inregistrate pe unMBeanServer, care
face parte din JMX Agent, si care le face accesibile aplicatiilor client.

Pe langa partea de monitorizare a resurselor, MBean-urile permit si implementarea unui mecanism


de notificare la aparitia unor erori sau schimbari de stare a aplicatiei.

MBean-urile pot fi "standard" sau "dinamice".

Un MBean standard este compus dintr-o interfata care specifica atributele si operatiile expuse, ca si
eventualele notificari care pot fi emise, si dintr-o clasa care ofera functionalitatea respectiva,
implementand interfata, toate definite static, la compile-time.

Un exemplu de MBean:

public interface HelloMBean {

public void sayHello();

public int add(int x, int y);

public String getName();

public int getCacheSize();

public void setCacheSize(int size);

Interfata HelloMBean defineste 2 operatii:

sayHello
add

Prin conventie o interfata Mbean ia numele clasei ce o implementeaza adaugand sufixul Mbean
(pentru interfata HelloMBean clasa se va numi Hello).

2.3 MBeanServer

MBeanServer este componenta centrala a unui JMX Agent. El functioneaza ca un registru pentru
obiectele expuse operatiilor de management prin intermediul agentului. Orice resursa care se va fi
monitorizata trebuie inregistrata ca MBean intr-un astfel de server, identificabila printr-un nume
unic.
Retele de calculatoare II

2.4 Agenti JMX

1. Se obtine o referinta la serverul MBean local


2. Se construieste un ObjectName Se construieste un ObjectName
3. Se instantiaza obiectul Se instantiaza obiectul
4. Se inregistreaza la server

import java.lang.management.*;
import javax.management.*;
public class Main {

public static void main(String[] args) throws Exception {


MBeanServer mbs = ManagementFactory.getPlatformMBeanServer(); //1
ObjectName name = new ObjectName("com.example.mbeans:type=Hello");//2
Hello mbean = new Hello(); //3
mbs.registerMBean(mbean, name); //4
Thread.sleep(Long.MAX_VALUE);
}
}

3. Notificari

MBean-urile pot emite notificari aplicatiilor client care s-au inregistrat pentru a le primi. Pentru
aceasta, obiectul MBean trebuie sa implementeze in plus interfata NotificationBroadcaster sau
NotificationEmitter (recomandat). Pentru a oferi receptorului informatii privind ordinea emiterii
lor, notificarile au asociat un numar de secventa. Numerele de secventa sunt asociate de catre
utilizator (nu sunt generate automat).

public class Hello extends NotificationBroadcasterSupport implements HelloMBean{


...
Notification n = new AttributeChangeNotification(this,
sequenceNumber++,
System.currentTimeMillis(),
"CacheSize changed",
"CacheSize",
"int",
oldSize,
this.cacheSize);
sendNotification(n);
...
}

4. Servicii de nume

Resursele monitorizate prin JMX la distanta (folosind JMX Remote API), sunt publicate de obicei
folosind un registru de nume (lookup service), dar aceasta nu este o cerinta stricta a specificatiei
JMX. Astfel, se pot folosi JNDI (Java Naming and Directory Interface), JINI sau chiar registrul de
nume al RMI, rmiregistry.

5. Instrumentarea JVM si utilitarul jconsole

Masina virtuala este ea insasi instrumentata folosind JMX. De aceea, putem avea acces la resursele
"standard" ale oricarei aplicatii (threaduri, memorie, procesor) chiar si fara a o instrumenta explicit,
intrucat suportul pentru acestea este oferit de JVM.
Retele de calculatoare II

Un foarte bun exemplu de aplicatie client JMX este utilitarul jconsole, aflat in distributia Java
standard. Pentru a monitoriza o masina virtuala Java folosind jconsole, aceasta trebuie pornita
specificand in linia de comanda proprietatea sun.com.management.jmxremote, astfel:

java -Dcom.sun.management.jmxremote MyClass

Executand apoi jconsole, masina virtuala va fi accesibila acestuia pentru monitorizare se pot
observa MBean-urile implementate in cadrul JVM-ului, starea threadurilor, a procesorului, a
memoriei etc. De asemenea, pentru MBean-urile care emit notificari, jconsole se poate inregistra si
primi aceste notificari.

5.1 Exemplu

Pentru a demonstra instrumentarea unei aplicatii folosind JConsole si JMX, vom utiliza un exemplu
simplu care implementeaza un contor. Codul este disponibil pe site-ul laboratorului.

Pentru a porni aplicatia, lansam in linia de comanda

set CLASSPATH=
java -Dcom.sun.management.jmxremote -cp Contor.jar -jar Contor.jar

Intr-un terminal se lanseaza apicatia JConsole. Programul poate fi gasit in directorul


JAVA_HOME.In Win XP acesta este de obicei

C:\Program Files\Java\jdk1.5.0_09\bin\jconsole.exe

Atunci cand rulam JConsole este lansata o fereastra de dialog Connect to Agent. Exista trei
taburi, dar numai Local va fi utilizat in acest moment. Tab-ul Local afiseaza o lista cu aplicatiile
monitorizate impreuna cu PID-ul lor. Selectati aplicatia Contor din lista si apasati Connect.
JConsole va afisa un rezumat.
Retele de calculatoare II

Rezumatul ofera informatii despre

Timpi de executie Uptime, CPU time si timpul de compilare


Fire de executie numarul de fire de executie active, numarul maxim de fire pornite, etc
Memorie Dimensiunea memoriei Heap, obiectele care trebuie finalizate, statistici despre
garbage collector
Clase numarul de clase incarcate in JVM
Sistemul de operare cantitatea de memorie disponibila pentru sistemul de operare,
memoria libera si memoria virtuala

Despre Threads, Memory si Classes se pot obtine informatii mai detaliate apeland celalate tab-uri
din fereastra JConsole.
Retele de calculatoare II

In sectiunea Memory este afisat un grafic cu memoria utilizata. Butonul Perform GC permite
lansarea operatiunii de garbage collection pe aplicatia monitorizata.

Sectiunea Threads afiseaza un grafic al utilizarii firelor de executie. Este prezentata si o lista cu
firele active pentru care putem obtine informatii detaliate.
Retele de calculatoare II

Vederea Classes afiseaza un grafic cu numarul de clase incarcate in JVM, si un combobox de unde
putem selecta intervalul de timp pentru care vor fi calculate statisticile.

Mai exista doua sectiuni in fereastra de dialog JConsole, VM si MBeans.

Sectiunea VM ofera detalii despre masina virtuala Java, inclusiv Classpath, argumente, tip CPU si
alte stastici despre sistemul de operare.
Retele de calculatoare II

Sectiunea MBean permite controlul si monitorizarea aplicatiilor. Pentru orice clasa ce trebuie
monitorizata, este creat un MBean care defineste interfata de management. In exemplul Contor,
clasa care trebuie monitorizata se numeste ContorBean.java si este o aplicatie simpla care
implementeaza un contor. Acesta este incrementat la fiecare secunda sau cand este invocata metoda
incCount. Clasa are o metoda reset si o variabila de tip String. Dorim sa instrumentam clasa
folosind JMX astfel incat sa putem monitoriza valoarea contorului, mesajul si sa resetam contorul.
Pentru aceasta vom crea un MBean

public interface ContorBeanMBean


{
public int getCount();
public String getMsg();
public void setMsg(String msg);
public void reset();
}

Obiectele MBean trebuie inregistrate la MBeanServer. Acesta este un agent JMX care se ocupa de
cererile clientilor care se conecteaza la framework.

private MBeanServer mbs=null;


public Contor(){
mbs=ManagementFactory.getPlatformMBeanServer();

Metoda getPlatformMBeanServer() intoarce un obiect MBeanServer care este responsabil cu


monitorizarea informatiilor despre memoria VM si firele de executie. Dupa ce am obtinut o
referinta la obiectul MBeanServer putem sa inregistram o instanta de ContorBean.

wmb=new ContorBean();
Thread t=new Thread(wmb);
t.start();

Pentru a monitoriza mai multe instante ale aceleasi clase, vom identifica instantele folosind un
obiect ObjectName. Aceste este format dintr-un domeniu si o lista de atribute. In exemplul de mai
jos avem domeniul ContorBean si un atribut contor. Dupa ce ObjectName a fost creat putem sa
inregistram bean-ul la MBeanServer.

try{
ObjectName nume = new ObjectName("ContorBean:name=contor");
mbs.registerMBean(wmb,nume);
}catch (Exception e) { e.printStackTrace(); }

Dupa inregistrare, este folosit mecanismul reflectiei pentru a identifica interfata ContorBeanMBean.
In acest moment avem un Bean monitorizat prin JMX.

Pentru a vizualiza componenta monitorizata ne intoarcem in JConsole si deschidem tab-ul MBean.


Acesta contine toate MBean-urile inregistrate pe server. JMImplementation contine MBean-uri
pentru agentul JMX, java.lang contine MBean-uri pentru monitorizarea JVM.
Retele de calculatoare II

Primul tab este Attributes. In exemplu avem campul Count. Pentru ca interfata ContorBeanMBean
are doar o metoda Get petru aceasta variabila, acesta este read-only. Daca se apeleaza valoarea
campului se va obtine un grafic al evolutiei acestei variabile in timp.

Deasemenea avem si variabila Msg, care are permisiuni read-write (valoarea se poate modifica prin
intermediul metodei setMsg din interfata MBean.

Daca vrem sa ne asiguram ca inspectam instanta potrivita a unei clase putem accesa sectiunea Info,
care afiseaza numele si clasa din care face parte MBean-ul.

Mai exista o metoda definita in interfata ContorBeanMBean, si anume metoda reset. Aceasta
poate fi gasita apeland tab-ul Operations.

Pentru ca nu respecta standardul pentru metodele getter/setter, metoda reset este privita ca o
operatie si poate fi utilizata pentru configurarea instantelor clasei ContorBean.
Retele de calculatoare II

Folosind o combinatie de JMX si JConsole putem sa instrumentam orice aplicatie Java pentru
montorizare si control.