JON Plugins
Conceitos

             Serviços


            Servidores


            Plataformas


                          2
Serviços



Recursos   Servidores


           Plataformas



                         3
Hierarquia entre Recursos




                            4
5
EJB, WebApp,
                   Recursos Filhos
  Datasource


JBoss App Server      Recurso



     iMac           Recurso Pai



                                     6
Service    BuscadorBean



            Server     JBoss EAP 4.3




           Plataform    Mac OS X




Recurso   Categoria       Tipo
                                       7
?
Por que cada tipo de recurso tem métricas e
           operações distintos?



                                              8
Métricas da   Métricas do
plataforma     servidor
                            9
Operações da
 plataforma



Operações
do servidor




               10
?
Por que alguns recursos são automaticamente
         descobertos e outros não?



                                              11
É tudo culpa do agente!
                          12
Arquitetura do
RHQ/Jopr/JON




http://www.redhat.com/f/pdf/Write_A_Plugin_WP_web.pdf   13
14
Arquitetura do
       jon-agent




http://www.redhat.com/f/pdf/Write_A_Plugin_WP_web.pdf   15
Serviços só são descobertos e
            monitorados pelo JON devido à
            existência de plugins específicos




jon-agent


 plugins

                                   ...

                                               16
Mas e se houver um serviço cuja
monitoração é desejada mas para o
  qual ainda não existam plugins?




    jon-agent


      plugins

                                    ...

                                          17
Agora sim!




  jon-agent


    plugins




              18
B AM
u c o
s   t   n
i   i   i
n   v   t
e   i   o
s   t   r
s   y   i
        n
        g
            19
business intelligence?
                         20
Desenvolva seus
              próprios plugins!


      http://www.jboss.org/community/docs/DOC-12824


http://support.rhq-project.org/display/RHQ/RHQ+Plugin+Community




                                                             21
a
              ert
           cob
       des




                 mé
                    tric
                         as

op
  er
     aç
        ões
                              22
facets
         23
Step-by-Step

    1. descoberta



      2. métricas



     3. operações




                    24
plugin descriptor

 discovery                  plugin
component                 component

                                      25
App          Package    Descriptor
  WebApp          WAR         web.xml
   Portlet        WAR       portlet.xml
     EJB          JAR        ejb-jar.xml
   MIDlet         JAR       MANIFEST
Enterprise App    EAR      application.xml
   MBeans         SAR      *-service.xml
 Connectors       RAR
 JON Plugin       JAR      rhq-plugin.xml

                                             26
http://viewvc.rhq-project.org/cgi-bin/viewvc.cgi/rhq/trunk/modules/core/client-api/src/main/resources/rhq-plugin.xsd?view=log




                                                                                                                          27
Discovery Component


public class BuscadorDiscovery implements ResourceDiscoveryComponent {

    public Set discoverResources(ResourceDiscoveryContext discoveryContext) {

        // Implementa a regra de descoberta do Buscador
        // (via tabela de processos, arquivo em disco, porta TCP/IP, etc)

        // Monta e retorna colecao com os recursos descobertos.

    }

}




                                                                            28
Plugin Component
public class BuscadorComponent implements ResourceComponent {

    public AvailabilityType getAvailability() {

         // Regra para verificar se o recurso esta disponivel ou nao.
    }

    public void start(ResourceContext context) {

         // Inicializa conexao com o rescurso
     }

    public void stop() {

         // Finaliza conexao com o recurso
    }

}                                                                   29
Plugin Component




public class BuscadorComponent implements ResourceComponent,
                                          MeasurementFacet {

    public void getValues(MeasurementReport report, Set metrics) {

        // Recuperar e armazenar em ‘report’ o valor de
        // cada metrica presente em ‘metrics’

    }
}
                                                                     30
Primeiro
 Plugin
 ...a gente nunca esquece...




                               31
$ svn co http://anonsvn.jboss.org/repos/jopr/trunk
A    trunk/.classpath
A    trunk/LICENSE_LGPL
A    trunk/LICENSE
A    trunk/.project
A    trunk/LICENSE_GPL                                        é preciso obter o
A    trunk/modules                                         código fonte do Jopr   ou
A    trunk/modules/plugins                                    do RHQ Project
A    trunk/modules/plugins/hibernate
A    trunk/modules/plugins/hibernate/src
A    trunk/modules/plugins/hibernate/src/test
A    trunk/modules/plugins/hibernate/src/test/java
A    trunk/modules/plugins/hibernate/src/test/java/org
A    trunk/modules/plugins/hibernate/src/test/java/org/rhq
A    trunk/modules/plugins/hibernate/src/test/java/org/rhq/plugins
A    trunk/modules/plugins/hibernate/src/test/java/org/rhq/plugins/hibernate
...
A    trunk/etc/jbas5-ejb-client/src/main/java
A    trunk/etc/jbas5-ejb-client/src/main/java/test
A    trunk/etc/jbas5-ejb-client/src/main/java/test/EjbClient.java
A    trunk/etc/jbas5-ejb-client/pom.xml
A    trunk/.settings
A    trunk/.settings/org.eclipse.jdt.core.prefs
A    trunk/.settings/org.maven.ide.eclipse.prefs
  U  trunk
Checked out revision 673.


                                                                                       32
existe um
gerador de
  plugins!




             download


                        33
execute o
                                                                        gerador de
                                                                          plugins


$ java -jar rhq-pluginGen-1.2.2-jar-with-dependencies.jar
Please specify the plugin root category PLATFORM(P), SERVER(S), SERVICE(I), i
Please specify its PackagePrefix: br.com.seatecnologia.monitoring.buscador
Please specify its FileSystemRoot: /Users/alegomes/Code/jboss.org/jopr/trunk/modules/plugins
Please specify its ComponentClass: BuscadorComponent
Please specify its DiscoveryClass: BuscadorDiscovery
Please specify if it should support Events (y/N):
Please specify its ParentType:
Please specify if it should support Monitoring (y/N): y
Please specify if it should support Operations (y/N):
Please specify if it should support Singleton (y/N):
Please specify if it should support ResourceConfiguration (y/N):
Please specify if it should support CreateChildren (y/N):
Please specify if it should support UsesExternalJarsInPlugin (y/N):
Please specify if it should support DeleteChildren (y/N):
Please specify if it should support ManualAddOfChildren (y/N):
Please specify if it should support UsePluginLifecycleListenerApi (y/N):
Please specify its Name: buscador
Please specify its Description: Plugin para acompanhamento da execucao do aplicativo de
simulacao de memory leaks

Do you want to add a child to buscador? (y/N)
Don't forget to add your plugin to the parent pom.xml                  responda as
                                                                        questões
                                                                                         34
$ ls -1 /Users/alegomes/Code/jboss.org/jopr/trunk/modules/plugins
JBossOSGi
buscador
hibernate
jboss-as
jboss-as-5            plugin gerado já na pasta
jboss-cache              de plugins do Jopr
pluginGen.log
pom.xml
rhq-server
tomcat

$ ls -1 /Users/alegomes/Code/jboss.org/jopr/trunk/modules/plugins/buscador
pom.xml
src


                        plugin gerado como
                         projeto Maven
                                                                         35
.deb   apt-get
.rpm    yum

.jar   maven
                 36
arquivo de
configuração do
    Maven




                 37
código fonte do
     plugin




                  37
arquivos de
configuração do
     plugin




                 37
Discovery e Plugin
  Components


                     38
descritor do
   plugin




               39
40
src/main/resources/META-INF/rhq-plugin.xml



<plugin-configuration>
     <!-- TODO add your own here -->
</plugin-configuration>
                                     comente isto por
                                 enquanto para testarmos
                                  apenas o build e deploy
                                        do plugin


<!-- plugin-configuration>
     <!- TODO add your own here ->
</plugin-configuration -->
                                                            41
mvn compile
                      mvn package
                       mvn clean
                           ...

http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html
                                                                                 42
mvn package
[INFO] Failed to resolve artifact.

GroupId: org.rhq                                   erro ao
ArtifactId: rhq-plugins-parent                    executar o
Version: 1.2.0-SNAPSHOT                         ‘mvn package’

Reason: Unable to download the artifact from any repository




<parent>
   <groupId>org.rhq</groupId>
   <artifactId>rhq-plugins-parent</artifactId>
   <version>1.2.0-SNAPSHOT</version><!-- TODO adjust RHQ version -->
</parent>
                                                                pom.xml
               lib requerida
                 pelo plugin
                   gerado
                                                                       43
Repositórios JBoss

http://repository.jboss.org/maven2
    Releases oficiais de libs JBoss
             e.g. 1.2.0.GA




http://snapshots.jboss.org/maven2
Libs JBoss ainda em desenvolvimento
          e.g. 1.3.0-SNAPSHOT

                                      44
repositório oficial
                    não possui a versão
                     1.2.0-SNAPSHOT




  repositório de
   snapshots até
  possui a versão
1.2.0-SNAPSHOT,
    mas já estão
 desenvolvendo a
1.3.0-SNAPSHOT

                                      45
pom.xml
                                           alteração da
                                           versão da lib

<parent>
    <groupId>org.rhq</groupId>
    <artifactId>rhq-plugins-parent</artifactId>
    <version>1.2.0.GA</version><!-- TODO adjust RHQ version -->
</parent>

...

<repositories>
    <repository>
       <id>jboss</id>
       <name>JBoss Repository</name>
       <url>http://repository.jboss.org/maven2/</url>
    </repository>
</repositories>
                                           inclusão de um dos
                                          repositórios do JBoss
                                                                  46
jopr/modules/plugins/buscador$ mvn package
[INFO] Scanning for projects...
Downloading: http://repository.jboss.org/maven2//org/rhq/rhq-plugins-
parent/1.2.0.GA/rhq-plugins-parent-1.2.0.GA.pom
3K downloaded
Downloading: http://repository.jboss.org/maven2//org/rhq/rhq-parent/
1.2.0.GA/rhq-parent-1.2.0.GA.pom
19K downloaded
Downloading: http://repository.jboss.org/maven2//org/apache/maven/wagon/
wagon-scm/1.0-beta-4/wagon-scm-1.0-beta-4.pom
...
Downloading: http://repository.jboss.org/maven2//commons-lang/commons-
lang/2.1/commons-lang-2.1.jar
202K downloaded
[INFO] [jar:jar]
[INFO] Building jar: /Volumes/Data/Code/jboss.org/jopr/modules/plugins/
buscador/target/buscador-plugin-1.2.0.GA.jar
[INFO]
------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO]
------------------------------------------------------------------------
[INFO] Total time: 8 minutes 16 seconds
[INFO] Finished at: Fri May 29 00:45:29 BRT 2009
[INFO] Final Memory: 16M/126M
[INFO]
------------------------------------------------------------------------   47
Deploy

 jopr/trunk/modules/plugins/buscador alegomes$

           cp target/buscador-plugin-1.2.0.GA.jar

       ~/JavaTools/jon-server-2.2.0.GA/jbossas/server/
 default/deploy/rhq.ear/rhq-downloads/rhq-plugins/




06:05:33,763 INFO   [ProductPluginDeployer] Discovered agent plugin [buscador]
06:05:34,406 INFO   [ProductPluginDeployer] Deploying [1] new or updated agent plugins: [buscador]

                                                                                    log do jon-server


                                                                                                     48
./rhq-server.sh console

...
07:22:52,375 INFO [EARDeployer] Init J2EE application: file:/Volumes/Data/Applications/JavaTools/
jon-server-2.2.0.GA/jbossas/server/default/deploy/rhq.ear/
07:23:01,581 INFO [SchedulerService] Scheduler has a default operation timeout of [600] seconds.
07:23:03,094 INFO [CoreServer] Version=[1.2.0.GA], Build Number=[3862], Build Date=[27.Apr.2009
16.56.25 EDT]
07:23:20,790 INFO [ProductPluginDeployer] Discovered agent plugin [buscador]
07:23:22,726 INFO [ProductPluginDeployer] Discovered agent plugin [Hibernate]
07:23:24,821 INFO [ProductPluginDeployer] Discovered agent plugin [JBossAS]
07:23:25,988 INFO [ProductPluginDeployer] Discovered agent plugin [RHQServer]
07:23:27,329 INFO [ProductPluginDeployer] Discovered agent plugin [RHQAgent]
07:23:28,437 INFO [ProductPluginDeployer] Discovered agent plugin [Apache]
07:23:29,579 INFO [ProductPluginDeployer] Discovered agent plugin [Database]
07:23:30,776 INFO [ProductPluginDeployer] Discovered agent plugin [IIS]
07:23:31,938 INFO [ProductPluginDeployer] Discovered agent plugin [JMX]
07:23:32,947 INFO [ProductPluginDeployer] Discovered agent plugin [Platforms]
07:23:33,940 INFO [ProductPluginDeployer] Discovered agent plugin [Postgres]
07:23:34,366 INFO [PersistenceUnitDeployment] Starting persistence unit
persistence.units:ear=rhq.ear,unitName=rhqpu
07:23:34,786 INFO [Version] Hibernate EntityManager 3.2.1.GA
...




                                                                                               49
sudo ./rhq-agent.sh
rhq-agent-jon-2.2.0/bin alegomes$ sudo ./rhq-agent.sh
RHQ 1.2.0.GA [3862] (Mon Apr 27 17:55:22 BRT 2009)
>
> plugins info
Plugins that are currently installed:

jopr-hibernate-plugin-2.2.0.GA.jar
        Plugin Name: Hibernate
        Last Updated: May 27, 2009 6:38:29 PM BRT
        File Size:    11,008 bytes
        MD5 Hashcode: d8540d9ff5e15867f7e19bd755fe1afe

...

rhq-postgres-plugin-1.2.0.GA.jar
        Plugin Name: Postgres
        Last Updated: May 27, 2009 6:38:26 PM BRT
        File Size:    475,851 bytes
        MD5 Hashcode: 7049b7b7d33ec5f5ebb903ffdb9f5e85

Total number of plugins currently installed: [10]
>                                                        50
sudo ./rhq-agent.sh



> plugins update
The plugin container has been stopped.
Updating plugins to their latest versions.
The plugin [buscador-plugin-1.2.0.GA.jar] has been updated.
Completed updating the plugins to their latest versions.

The plugin container has been started.
>




                                                          51
sudo ./rhq-agent.sh
> plugins info
Plugins that are currently installed:

buscador-plugin-1.2.0.GA.jar
        Plugin Name: buscador
        Last Updated: May 29, 2009 7:29:26 AM BRT
        File Size:    6,567 bytes
        MD5 Hashcode: 2bd7e8dcbd206ee56a9aec9f6b9b6e6d

jopr-hibernate-plugin-2.2.0.GA.jar
        Plugin Name: Hibernate
        Last Updated: May 27, 2009 6:38:29 PM BRT
        File Size:    11,008 bytes
        MD5 Hashcode: d8540d9ff5e15867f7e19bd755fe1afe
...
rhq-postgres-plugin-1.2.0.GA.jar
        Plugin Name: Postgres
        Last Updated: May 27, 2009 6:38:26 PM BRT
        File Size:    475,851 bytes
        MD5 Hashcode: 7049b7b7d33ec5f5ebb903ffdb9f5e85

Total number of plugins currently installed: [11]        52
Auto-Discovery




                 53
Discovery Component

import org.rhq.core.pluginapi.inventory.ResourceDiscoveryComponent;

public class BuscadorDiscovery implements ResourceDiscoveryComponent {

public Set discoverResources(ResourceDiscoveryContext discoveryContext) throws Exception {

       // Todos os recursos descobertos serao agrupados neste conjunto
       Set discoveredResources = new HashSet();



      // Implementa a regra de descoberta do Buscador
      // (via tabela de processos, arquivo em disco, porta TCP/IP, etc)



      // Cria objeto que represente o recurso descoberto
       DiscoveredResourceDetails detail = .....;

      // Adicione cada um dos recursos descobertos ao resultado
      discoveredResources.add(detail);

      return discoveredResources;
}
                                                                                         54
Process Scan
                             Process Info Query Language



Process|basename|match=^java.*,arg|org.jboss.Main|match=.*

             process|pidfile|match=/etc/product/lock.pid



List<ProcessScanResult> autoDiscoveryResults = context.getAutoDiscoveredProcesses();

for (ProcessScanResult result : autoDiscoveryResults) {
      ProcessInfo procInfo = result.getProcessInfo();
      ...
      DiscoveredResourceDetails detail =
            new DiscoveredResourceDetails( resourceType, key, name, null,
                                           description, childConfig, procInfo );

       result.add(detail);
   }
Discovery Component                                                                55
56
Plugin Component
public class BuscadorComponent implements ResourceComponent {

    public AvailabilityType getAvailability() {

         // Regra para verificar se o recurso esta disponivel ou nao.
         return AvailabilityType.UP;
    }

    public void start(ResourceContext context) throws Exception {

         // Inicializa conexao com o rescurso
     }

    public void stop() {

         // Finaliza conexao com o recurso
    }

}                                                                       57
Plugin Component



public class BuscadorComponent implements ResourceComponent, MeasurementFacet {

 /**
  * Coleta valores das metricas mapeadas no descritor
  */
  public void getValues(MeasurementReport report, Set metrics) throws Exception {

      for (MeasurementScheduleRequest metrica : metrics) {

          if (metrica.getName().equals("umaMetricaQualquer")) {
             MeasurementDataNumeric valor = null;

             valor = new MeasurementDataNumeric(metrica, Double.valueOf(VALOR_QUALQUER));
             report.addData(valor);
          }
          // Fazer a mesma coisa para as outras metricas
      }
  }                                                                                         58
plugin-configuration




<plugin-configuration>

</plugin-configuration>

                          59
plugin-configuration




                      60
plugin-configuration




<plugin-configuration>
   <c:simple-property name="contexto" type="string" required="true" />
</plugin-configuration>
                                                                    61
plugin-configuration




                      62
Measurement Facet


<!-- jboss.web:name=http-0.0.0.0-8080,type=ThreadPool:currentThreadsBusy -->
<metric property="jboss.web:name=%schema%%dash%%address%-%port%,type=ThreadPool:currentThreadsBusy"
        displayName="Threads Active"
        defaultOn="true" category="utilization" displayType="summary"/>




public void getValues(MeasurementReport report,
                      Set<MeasurementScheduleRequest> requests) {

    ...

}




                                                                                                      63
Configuration Facet


<resource-configuration>

  <c:group name="connection" displayName="Connection Information">
      <c:simple-property name="type">
             <c:property-options>
                 <c:option value="no-tx-datasource" name="No TX Datasource"/>
                 <c:option value="local-tx-datasource" name="Local TX Datasource" default="true"/>
              <c:option value="xa-datasource" name="XA Datasource"/>
           </c:property-options>
       </c:simple-property>
       ...

</resource-configuration>




                                                                                                     64
Operation Facet

<operation name="start" displayName="Start"
                 description="Start this application server.
                              The script used is specified in the Operations
                              group of connection properties.">

       <results>
           <c:simple-property name="operationResult"
                              description="Outcome of starting the server."/>
       </results>

</operation>



public OperationResult invokeOperation(String name, Configuration configuration) throws InterruptedException {

      JBossASServerSupportedOperations operation =
             Enum.valueOf(JBossASServerSupportedOperations.class,
                          name.toUpperCase());

       return operationsDelegate.invoke(operation, configuration);
}
                                                                                                             65
Content Facet
<content name="cumulativePatch" displayName="Cumulative Patch" category="deployable"
         description="Automatically installable application server patches">

      <configuration>
         <c:simple-property      name="jiraId"/>
         <c:simple-property      name="distributionStatus"/>
         <c:simple-property      name="downloadUrl"/>
         <c:simple-property      name="instructionCompatibilityVersion"/>
     </configuration>

</content>




// ContentFacet Implementation   --------------------------------------------

   public List<DeployPackageStep> generateInstallationSteps(ResourcePackageDetails packageDetails) {
       return contentFacetDelegate.generateInstallationSteps(packageDetails);
   }

   public DeployPackagesResponse deployPackages(Set<ResourcePackageDetails> packages, ContentServices contentServices) {
   	return contentFacetDelegate.deployPackages(packages, contentServices);
   }

   public RemovePackagesResponse removePackages(Set<ResourcePackageDetails> packages) {
       return contentFacetDelegate.removePackages(packages);
   }

   public Set<ResourcePackageDetails> discoverDeployedPackages(PackageType type) {
   	return contentFacetDelegate.discoverDeployedPackages(type);
   }

   public InputStream retrievePackageBits(ResourcePackageDetails packageDetails) {
       return contentFacetDelegate.retrievePackageBits(packageDetails);
   }
                                                                                                                           66
Event Facet

<event name="logEntry" description="an entry in a log file"/>




public void start(ResourceContext context) throws Exception {
  ...
  this.logFileEventDelegate = new LogFileEventResourceComponentHelper(this.resourceContext);
  this.logFileEventDelegate.startLogFileEventPollers();
}

public void stop() {
   this.logFileEventDelegate.stopLogFileEventPollers();
   ...
}




                                                                                               67
Baixe, instale e configure o Maven
Baixe e descompacte o código fonte do Jopr
    Baixe e execute o gerador de plugins
       Faça o deploy do plugin gerado
             Experimente a PIQL
             Explore suas facetas

                                         68
JUST DO IT




69




     Sugestão: inspire-se no exemplo RHQ_httptest2.zip, disponível no servidor.
Q&A

Jopr Plugin Development

  • 1.
  • 2.
    Conceitos Serviços Servidores Plataformas 2
  • 3.
    Serviços Recursos Servidores Plataformas 3
  • 4.
  • 5.
  • 6.
    EJB, WebApp, Recursos Filhos Datasource JBoss App Server Recurso iMac Recurso Pai 6
  • 7.
    Service BuscadorBean Server JBoss EAP 4.3 Plataform Mac OS X Recurso Categoria Tipo 7
  • 8.
    ? Por que cadatipo de recurso tem métricas e operações distintos? 8
  • 9.
    Métricas da Métricas do plataforma servidor 9
  • 10.
  • 11.
    ? Por que algunsrecursos são automaticamente descobertos e outros não? 11
  • 12.
    É tudo culpado agente! 12
  • 13.
  • 14.
  • 15.
    Arquitetura do jon-agent http://www.redhat.com/f/pdf/Write_A_Plugin_WP_web.pdf 15
  • 16.
    Serviços só sãodescobertos e monitorados pelo JON devido à existência de plugins específicos jon-agent plugins ... 16
  • 17.
    Mas e sehouver um serviço cuja monitoração é desejada mas para o qual ainda não existam plugins? jon-agent plugins ... 17
  • 18.
    Agora sim! jon-agent plugins 18
  • 19.
    B AM u co s t n i i i n v t e i o s t r s y i n g 19
  • 20.
  • 21.
    Desenvolva seus próprios plugins! http://www.jboss.org/community/docs/DOC-12824 http://support.rhq-project.org/display/RHQ/RHQ+Plugin+Community 21
  • 22.
    a ert cob des mé tric as op er aç ões 22
  • 23.
  • 24.
    Step-by-Step 1. descoberta 2. métricas 3. operações 24
  • 25.
    plugin descriptor discovery plugin component component 25
  • 26.
    App Package Descriptor WebApp WAR web.xml Portlet WAR portlet.xml EJB JAR ejb-jar.xml MIDlet JAR MANIFEST Enterprise App EAR application.xml MBeans SAR *-service.xml Connectors RAR JON Plugin JAR rhq-plugin.xml 26
  • 27.
  • 28.
    Discovery Component public classBuscadorDiscovery implements ResourceDiscoveryComponent { public Set discoverResources(ResourceDiscoveryContext discoveryContext) { // Implementa a regra de descoberta do Buscador // (via tabela de processos, arquivo em disco, porta TCP/IP, etc) // Monta e retorna colecao com os recursos descobertos. } } 28
  • 29.
    Plugin Component public classBuscadorComponent implements ResourceComponent { public AvailabilityType getAvailability() { // Regra para verificar se o recurso esta disponivel ou nao. } public void start(ResourceContext context) { // Inicializa conexao com o rescurso } public void stop() { // Finaliza conexao com o recurso } } 29
  • 30.
    Plugin Component public classBuscadorComponent implements ResourceComponent, MeasurementFacet { public void getValues(MeasurementReport report, Set metrics) { // Recuperar e armazenar em ‘report’ o valor de // cada metrica presente em ‘metrics’ } } 30
  • 31.
    Primeiro Plugin ...agente nunca esquece... 31
  • 32.
    $ svn cohttp://anonsvn.jboss.org/repos/jopr/trunk A trunk/.classpath A trunk/LICENSE_LGPL A trunk/LICENSE A trunk/.project A trunk/LICENSE_GPL é preciso obter o A trunk/modules código fonte do Jopr ou A trunk/modules/plugins do RHQ Project A trunk/modules/plugins/hibernate A trunk/modules/plugins/hibernate/src A trunk/modules/plugins/hibernate/src/test A trunk/modules/plugins/hibernate/src/test/java A trunk/modules/plugins/hibernate/src/test/java/org A trunk/modules/plugins/hibernate/src/test/java/org/rhq A trunk/modules/plugins/hibernate/src/test/java/org/rhq/plugins A trunk/modules/plugins/hibernate/src/test/java/org/rhq/plugins/hibernate ... A trunk/etc/jbas5-ejb-client/src/main/java A trunk/etc/jbas5-ejb-client/src/main/java/test A trunk/etc/jbas5-ejb-client/src/main/java/test/EjbClient.java A trunk/etc/jbas5-ejb-client/pom.xml A trunk/.settings A trunk/.settings/org.eclipse.jdt.core.prefs A trunk/.settings/org.maven.ide.eclipse.prefs U trunk Checked out revision 673. 32
  • 33.
    existe um gerador de plugins! download 33
  • 34.
    execute o gerador de plugins $ java -jar rhq-pluginGen-1.2.2-jar-with-dependencies.jar Please specify the plugin root category PLATFORM(P), SERVER(S), SERVICE(I), i Please specify its PackagePrefix: br.com.seatecnologia.monitoring.buscador Please specify its FileSystemRoot: /Users/alegomes/Code/jboss.org/jopr/trunk/modules/plugins Please specify its ComponentClass: BuscadorComponent Please specify its DiscoveryClass: BuscadorDiscovery Please specify if it should support Events (y/N): Please specify its ParentType: Please specify if it should support Monitoring (y/N): y Please specify if it should support Operations (y/N): Please specify if it should support Singleton (y/N): Please specify if it should support ResourceConfiguration (y/N): Please specify if it should support CreateChildren (y/N): Please specify if it should support UsesExternalJarsInPlugin (y/N): Please specify if it should support DeleteChildren (y/N): Please specify if it should support ManualAddOfChildren (y/N): Please specify if it should support UsePluginLifecycleListenerApi (y/N): Please specify its Name: buscador Please specify its Description: Plugin para acompanhamento da execucao do aplicativo de simulacao de memory leaks Do you want to add a child to buscador? (y/N) Don't forget to add your plugin to the parent pom.xml responda as questões 34
  • 35.
    $ ls -1/Users/alegomes/Code/jboss.org/jopr/trunk/modules/plugins JBossOSGi buscador hibernate jboss-as jboss-as-5 plugin gerado já na pasta jboss-cache de plugins do Jopr pluginGen.log pom.xml rhq-server tomcat $ ls -1 /Users/alegomes/Code/jboss.org/jopr/trunk/modules/plugins/buscador pom.xml src plugin gerado como projeto Maven 35
  • 36.
    .deb apt-get .rpm yum .jar maven 36
  • 37.
  • 38.
  • 39.
  • 40.
    Discovery e Plugin Components 38
  • 41.
    descritor do plugin 39
  • 42.
  • 43.
    src/main/resources/META-INF/rhq-plugin.xml <plugin-configuration> <!-- TODO add your own here --> </plugin-configuration> comente isto por enquanto para testarmos apenas o build e deploy do plugin <!-- plugin-configuration> <!- TODO add your own here -> </plugin-configuration --> 41
  • 44.
    mvn compile mvn package mvn clean ... http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html 42
  • 45.
    mvn package [INFO] Failedto resolve artifact. GroupId: org.rhq erro ao ArtifactId: rhq-plugins-parent executar o Version: 1.2.0-SNAPSHOT ‘mvn package’ Reason: Unable to download the artifact from any repository <parent> <groupId>org.rhq</groupId> <artifactId>rhq-plugins-parent</artifactId> <version>1.2.0-SNAPSHOT</version><!-- TODO adjust RHQ version --> </parent> pom.xml lib requerida pelo plugin gerado 43
  • 46.
    Repositórios JBoss http://repository.jboss.org/maven2 Releases oficiais de libs JBoss e.g. 1.2.0.GA http://snapshots.jboss.org/maven2 Libs JBoss ainda em desenvolvimento e.g. 1.3.0-SNAPSHOT 44
  • 47.
    repositório oficial não possui a versão 1.2.0-SNAPSHOT repositório de snapshots até possui a versão 1.2.0-SNAPSHOT, mas já estão desenvolvendo a 1.3.0-SNAPSHOT 45
  • 48.
    pom.xml alteração da versão da lib <parent> <groupId>org.rhq</groupId> <artifactId>rhq-plugins-parent</artifactId> <version>1.2.0.GA</version><!-- TODO adjust RHQ version --> </parent> ... <repositories> <repository> <id>jboss</id> <name>JBoss Repository</name> <url>http://repository.jboss.org/maven2/</url> </repository> </repositories> inclusão de um dos repositórios do JBoss 46
  • 49.
    jopr/modules/plugins/buscador$ mvn package [INFO]Scanning for projects... Downloading: http://repository.jboss.org/maven2//org/rhq/rhq-plugins- parent/1.2.0.GA/rhq-plugins-parent-1.2.0.GA.pom 3K downloaded Downloading: http://repository.jboss.org/maven2//org/rhq/rhq-parent/ 1.2.0.GA/rhq-parent-1.2.0.GA.pom 19K downloaded Downloading: http://repository.jboss.org/maven2//org/apache/maven/wagon/ wagon-scm/1.0-beta-4/wagon-scm-1.0-beta-4.pom ... Downloading: http://repository.jboss.org/maven2//commons-lang/commons- lang/2.1/commons-lang-2.1.jar 202K downloaded [INFO] [jar:jar] [INFO] Building jar: /Volumes/Data/Code/jboss.org/jopr/modules/plugins/ buscador/target/buscador-plugin-1.2.0.GA.jar [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESSFUL [INFO] ------------------------------------------------------------------------ [INFO] Total time: 8 minutes 16 seconds [INFO] Finished at: Fri May 29 00:45:29 BRT 2009 [INFO] Final Memory: 16M/126M [INFO] ------------------------------------------------------------------------ 47
  • 50.
    Deploy jopr/trunk/modules/plugins/buscador alegomes$ cp target/buscador-plugin-1.2.0.GA.jar ~/JavaTools/jon-server-2.2.0.GA/jbossas/server/ default/deploy/rhq.ear/rhq-downloads/rhq-plugins/ 06:05:33,763 INFO [ProductPluginDeployer] Discovered agent plugin [buscador] 06:05:34,406 INFO [ProductPluginDeployer] Deploying [1] new or updated agent plugins: [buscador] log do jon-server 48
  • 51.
    ./rhq-server.sh console ... 07:22:52,375 INFO[EARDeployer] Init J2EE application: file:/Volumes/Data/Applications/JavaTools/ jon-server-2.2.0.GA/jbossas/server/default/deploy/rhq.ear/ 07:23:01,581 INFO [SchedulerService] Scheduler has a default operation timeout of [600] seconds. 07:23:03,094 INFO [CoreServer] Version=[1.2.0.GA], Build Number=[3862], Build Date=[27.Apr.2009 16.56.25 EDT] 07:23:20,790 INFO [ProductPluginDeployer] Discovered agent plugin [buscador] 07:23:22,726 INFO [ProductPluginDeployer] Discovered agent plugin [Hibernate] 07:23:24,821 INFO [ProductPluginDeployer] Discovered agent plugin [JBossAS] 07:23:25,988 INFO [ProductPluginDeployer] Discovered agent plugin [RHQServer] 07:23:27,329 INFO [ProductPluginDeployer] Discovered agent plugin [RHQAgent] 07:23:28,437 INFO [ProductPluginDeployer] Discovered agent plugin [Apache] 07:23:29,579 INFO [ProductPluginDeployer] Discovered agent plugin [Database] 07:23:30,776 INFO [ProductPluginDeployer] Discovered agent plugin [IIS] 07:23:31,938 INFO [ProductPluginDeployer] Discovered agent plugin [JMX] 07:23:32,947 INFO [ProductPluginDeployer] Discovered agent plugin [Platforms] 07:23:33,940 INFO [ProductPluginDeployer] Discovered agent plugin [Postgres] 07:23:34,366 INFO [PersistenceUnitDeployment] Starting persistence unit persistence.units:ear=rhq.ear,unitName=rhqpu 07:23:34,786 INFO [Version] Hibernate EntityManager 3.2.1.GA ... 49
  • 52.
    sudo ./rhq-agent.sh rhq-agent-jon-2.2.0/bin alegomes$sudo ./rhq-agent.sh RHQ 1.2.0.GA [3862] (Mon Apr 27 17:55:22 BRT 2009) > > plugins info Plugins that are currently installed: jopr-hibernate-plugin-2.2.0.GA.jar Plugin Name: Hibernate Last Updated: May 27, 2009 6:38:29 PM BRT File Size: 11,008 bytes MD5 Hashcode: d8540d9ff5e15867f7e19bd755fe1afe ... rhq-postgres-plugin-1.2.0.GA.jar Plugin Name: Postgres Last Updated: May 27, 2009 6:38:26 PM BRT File Size: 475,851 bytes MD5 Hashcode: 7049b7b7d33ec5f5ebb903ffdb9f5e85 Total number of plugins currently installed: [10] > 50
  • 53.
    sudo ./rhq-agent.sh > pluginsupdate The plugin container has been stopped. Updating plugins to their latest versions. The plugin [buscador-plugin-1.2.0.GA.jar] has been updated. Completed updating the plugins to their latest versions. The plugin container has been started. > 51
  • 54.
    sudo ./rhq-agent.sh > pluginsinfo Plugins that are currently installed: buscador-plugin-1.2.0.GA.jar Plugin Name: buscador Last Updated: May 29, 2009 7:29:26 AM BRT File Size: 6,567 bytes MD5 Hashcode: 2bd7e8dcbd206ee56a9aec9f6b9b6e6d jopr-hibernate-plugin-2.2.0.GA.jar Plugin Name: Hibernate Last Updated: May 27, 2009 6:38:29 PM BRT File Size: 11,008 bytes MD5 Hashcode: d8540d9ff5e15867f7e19bd755fe1afe ... rhq-postgres-plugin-1.2.0.GA.jar Plugin Name: Postgres Last Updated: May 27, 2009 6:38:26 PM BRT File Size: 475,851 bytes MD5 Hashcode: 7049b7b7d33ec5f5ebb903ffdb9f5e85 Total number of plugins currently installed: [11] 52
  • 55.
  • 56.
    Discovery Component import org.rhq.core.pluginapi.inventory.ResourceDiscoveryComponent; publicclass BuscadorDiscovery implements ResourceDiscoveryComponent { public Set discoverResources(ResourceDiscoveryContext discoveryContext) throws Exception { // Todos os recursos descobertos serao agrupados neste conjunto Set discoveredResources = new HashSet(); // Implementa a regra de descoberta do Buscador // (via tabela de processos, arquivo em disco, porta TCP/IP, etc) // Cria objeto que represente o recurso descoberto DiscoveredResourceDetails detail = .....; // Adicione cada um dos recursos descobertos ao resultado discoveredResources.add(detail); return discoveredResources; } 54
  • 57.
    Process Scan Process Info Query Language Process|basename|match=^java.*,arg|org.jboss.Main|match=.* process|pidfile|match=/etc/product/lock.pid List<ProcessScanResult> autoDiscoveryResults = context.getAutoDiscoveredProcesses(); for (ProcessScanResult result : autoDiscoveryResults) { ProcessInfo procInfo = result.getProcessInfo(); ... DiscoveredResourceDetails detail = new DiscoveredResourceDetails( resourceType, key, name, null, description, childConfig, procInfo ); result.add(detail); } Discovery Component 55
  • 58.
  • 59.
    Plugin Component public classBuscadorComponent implements ResourceComponent { public AvailabilityType getAvailability() { // Regra para verificar se o recurso esta disponivel ou nao. return AvailabilityType.UP; } public void start(ResourceContext context) throws Exception { // Inicializa conexao com o rescurso } public void stop() { // Finaliza conexao com o recurso } } 57
  • 60.
    Plugin Component public classBuscadorComponent implements ResourceComponent, MeasurementFacet { /** * Coleta valores das metricas mapeadas no descritor */ public void getValues(MeasurementReport report, Set metrics) throws Exception { for (MeasurementScheduleRequest metrica : metrics) { if (metrica.getName().equals("umaMetricaQualquer")) { MeasurementDataNumeric valor = null; valor = new MeasurementDataNumeric(metrica, Double.valueOf(VALOR_QUALQUER)); report.addData(valor); } // Fazer a mesma coisa para as outras metricas } } 58
  • 61.
  • 62.
  • 63.
    plugin-configuration <plugin-configuration> <c:simple-property name="contexto" type="string" required="true" /> </plugin-configuration> 61
  • 64.
  • 65.
    Measurement Facet <!-- jboss.web:name=http-0.0.0.0-8080,type=ThreadPool:currentThreadsBusy--> <metric property="jboss.web:name=%schema%%dash%%address%-%port%,type=ThreadPool:currentThreadsBusy" displayName="Threads Active" defaultOn="true" category="utilization" displayType="summary"/> public void getValues(MeasurementReport report, Set<MeasurementScheduleRequest> requests) { ... } 63
  • 66.
    Configuration Facet <resource-configuration> <c:group name="connection" displayName="Connection Information"> <c:simple-property name="type"> <c:property-options> <c:option value="no-tx-datasource" name="No TX Datasource"/> <c:option value="local-tx-datasource" name="Local TX Datasource" default="true"/> <c:option value="xa-datasource" name="XA Datasource"/> </c:property-options> </c:simple-property> ... </resource-configuration> 64
  • 67.
    Operation Facet <operation name="start"displayName="Start" description="Start this application server. The script used is specified in the Operations group of connection properties."> <results> <c:simple-property name="operationResult" description="Outcome of starting the server."/> </results> </operation> public OperationResult invokeOperation(String name, Configuration configuration) throws InterruptedException { JBossASServerSupportedOperations operation = Enum.valueOf(JBossASServerSupportedOperations.class, name.toUpperCase()); return operationsDelegate.invoke(operation, configuration); } 65
  • 68.
    Content Facet <content name="cumulativePatch"displayName="Cumulative Patch" category="deployable" description="Automatically installable application server patches"> <configuration> <c:simple-property name="jiraId"/> <c:simple-property name="distributionStatus"/> <c:simple-property name="downloadUrl"/> <c:simple-property name="instructionCompatibilityVersion"/> </configuration> </content> // ContentFacet Implementation -------------------------------------------- public List<DeployPackageStep> generateInstallationSteps(ResourcePackageDetails packageDetails) { return contentFacetDelegate.generateInstallationSteps(packageDetails); } public DeployPackagesResponse deployPackages(Set<ResourcePackageDetails> packages, ContentServices contentServices) { return contentFacetDelegate.deployPackages(packages, contentServices); } public RemovePackagesResponse removePackages(Set<ResourcePackageDetails> packages) { return contentFacetDelegate.removePackages(packages); } public Set<ResourcePackageDetails> discoverDeployedPackages(PackageType type) { return contentFacetDelegate.discoverDeployedPackages(type); } public InputStream retrievePackageBits(ResourcePackageDetails packageDetails) { return contentFacetDelegate.retrievePackageBits(packageDetails); } 66
  • 69.
    Event Facet <event name="logEntry"description="an entry in a log file"/> public void start(ResourceContext context) throws Exception { ... this.logFileEventDelegate = new LogFileEventResourceComponentHelper(this.resourceContext); this.logFileEventDelegate.startLogFileEventPollers(); } public void stop() { this.logFileEventDelegate.stopLogFileEventPollers(); ... } 67
  • 70.
    Baixe, instale econfigure o Maven Baixe e descompacte o código fonte do Jopr Baixe e execute o gerador de plugins Faça o deploy do plugin gerado Experimente a PIQL Explore suas facetas 68
  • 71.
    JUST DO IT 69 Sugestão: inspire-se no exemplo RHQ_httptest2.zip, disponível no servidor.
  • 72.

Editor's Notes

  • #3 Os 3 conceitos principais do JON s&amp;#xE3;o: - Plataforma: Dell 3.4Ghz 4GB RAM... - Servidores: JBoss, Apache, IIS, Postgres... - Servi&amp;#xE7;o: EJB, Datasource, WebApp...
  • #4 Todos os 3 elementos s&amp;#xE3;o chamados de &amp;#x2018;recurso&amp;#x2019;.
  • #5 Qualquer recurso pode ter um recurso pai e v&amp;#xE1;rios recursos filhos.
  • #7 O servidor JBoss AS &amp;#xE9; recurso filho da plataforma iMac. A plataforma iMac &amp;#xE9; recurso pai do servidor JBoss AS. Os servi&amp;#xE7;os EJBs, WebApps e Datasource s&amp;#xE3;o recursos filhos do servidor JBoss AS. O servidor JBoss AS &amp;#xE9; recurso pai dos servi&amp;#xE7;os EJB, WebApp e Datasource.
  • #8 Conceitos: Recurso, Categoria e Tipo
  • #9 Por exemplo, uma plataforma Linux tem X m&amp;#xE9;tricas dispon&amp;#xED;veis, enquanto um servidor JBoss tem Y m&amp;#xE9;tricas, totalmente diferente daquelas X.
  • #10 Reparem que o conjunto de m&amp;#xE9;tricas da plataforma &amp;#xE9; diferente do conjunto de m&amp;#xE9;tricas do servidor.
  • #11 O conjunto de opera&amp;#xE7;&amp;#xF5;es tambem diferem de um tipo de recurso para outro.
  • #12 Por exemplo, por que o PostgreSQL &amp;#xE9; detectado na plataforma e o MySQL, n&amp;#xE3;o?
  • #14 Relembrando a arquitetura do JON: - Um &amp;#xFA;nico jon-server &amp;#xE9; necess&amp;#xE1;rio. - Um jon-agent deve ser instalado em cada m&amp;#xE1;quina a ser monitorada. - O jon-server comunica-se com v&amp;#xE1;rios jon-agents, e vice-versa.
  • #15 O jon-agent busca no ambiente em que foi instalado por todos servi&amp;#xE7;os que reconhece. Se o administrador do JON, pela interface do jon-server, solicitar a monitora&amp;#xE7;&amp;#xE3;o dos recursos identificados pelo jon-agent, o agente inicia a coleta peri&amp;#xF3;dica de dados de cada servi&amp;#xE7;o descoberto.
  • #16 O elemento central do agente do JON s&amp;#xE3;o seus plugins. Cada plugin &amp;#xE9; respons&amp;#xE1;vel pela descoberta e monitora&amp;#xE7;&amp;#xE3;o de um tipo espec&amp;#xED;fico de recurso.
  • #17 O que define o poder do JON &amp;#xE9; o conjunto de plugins dispon&amp;#xED;vel em seus agentes. Ou seja, se existir um plugin do JON espec&amp;#xED;fico para Oracle, o Oracle ser&amp;#xE1; monitorado. Caso contr&amp;#xE1;rio, n&amp;#xE3;o ser&amp;#xE1;.
  • #18 Qualquer pessoa pode desenvolver e acrescentar novos plugins ao JON.
  • #19 Basta utilizar a API definida no projeto RHQ.
  • #20 E a&amp;#xED; &amp;#xE9; poss&amp;#xED;vel realizar o monitoramento de atividades de neg&amp;#xF3;cio, extraindo m&amp;#xE9;tricas estrat&amp;#xE9;gicas para a monitora&amp;#xE7;&amp;#xE3;o das atividades corporativas e apoio &amp;#xE0; tomada de decis&amp;#xF5;es gerenciais.
  • #23 Todo plugin pode fazer 3 coisas...
  • #24 Essas 3 coisas s&amp;#xE3;o chamadas de facetas (facets) do plugin.
  • #25 Cada uma dessas 3 coisas &amp;#xE9; implementada de forma independente.
  • #26 Para que essas 3 coisas sejam feitas, &amp;#xE9; preciso...
  • #27 Descritores fazem parte da cultura Java. Pra cada tipo de pacote Java existe um tipo espec&amp;#xED;fico de descritor.
  • #28 Esta &amp;#xE9; a estrutura do plugin descriptor. Apresentar: - Depend&amp;#xEA;ncias de um plugin com outros - Sequ&amp;#xEA;ncia de plataformas, servidores e servi&amp;#xE7;os - Cada tipo de recurso deve ter um nome &amp;#xFA;nico no plugin - Para cada tipo de recurso, define-se a l&amp;#xF3;gica de descoberta, as m&amp;#xE9;tricas e opera&amp;#xE7;&amp;#xF5;es suportadas, dentre outros.
  • #29 O Discovery Component &amp;#xE9; invocado periodicamente pelo agente.
  • #30  Ap&amp;#xF3;s a descoberta, o Plugin Component entra em a&amp;#xE7;&amp;#xE3;o para coleta de m&amp;#xE9;tricas, execu&amp;#xE7;&amp;#xE3;o de opera&amp;#xE7;&amp;#xF5;es, etc.
  • #31  Para cada fun&amp;#xE7;&amp;#xE3;o b&amp;#xE1;sica do plugin, &amp;#xE9; necess&amp;#xE1;ria a implementa&amp;#xE7;&amp;#xE3;o de uma faceta espec&amp;#xED;fica. Cada faceta corresponde a uma interface espec&amp;#xED;fica a ser implementada pelo desenvolvedor do plugin.
  • #33 Por conveni&amp;#xEA;ncia..
  • #50 J&amp;#xE1; at&amp;#xE9; tinha o reposit&amp;#xF3;rio no profile dev, mas seria mais coisa a explicar...
  • #52 O projeto Maven do plugin extende o projeto Maven ajopr-2/modules/plugins/teste2 todos os plugins.
  • #54 Altera&amp;#xE7;&amp;#xE3;o no pom.xml
  • #55 Altera&amp;#xE7;&amp;#xE3;o no pom.xml
  • #56 Build
  • #57 Deploy
  • #63 O Discovery Component &amp;#xE9; invocado periodicamente pelo agente.
  • #66  Ap&amp;#xF3;s a descoberta, o Plugin Component entra em a&amp;#xE7;&amp;#xE3;o para coleta de m&amp;#xE9;tricas, execu&amp;#xE7;&amp;#xE3;o de opera&amp;#xE7;&amp;#xF5;es, etc.
  • #67  Para cada fun&amp;#xE7;&amp;#xE3;o b&amp;#xE1;sica do plugin, &amp;#xE9; necess&amp;#xE1;ria a implementa&amp;#xE7;&amp;#xE3;o de uma faceta espec&amp;#xED;fica. Cada faceta corresponde a uma interface espec&amp;#xED;fica a ser implementada pelo desenvolvedor do plugin.
  • #71 Exemplo de configura&amp;#xE7;&amp;#xE3;o