显示导航

Grails 3 使用 JavaMelody 监视

了解如何使用 JavaMelody 设置和监视你的应用程序

作者:Ben Rhine

Grails 版本 3.3.2

1 培训

Grails 培训 - 由创建并积极维护 Grails 框架的人员开发并交付!

2 开始使用

在本指南中,我们将展示如何使用 JavaMelody 设置和使用 Grails 3 应用程序。我们将会使用 grails-melody-plugin

2.1 所需内容

要完成本指南,你需要以下内容

  • 一些时间

  • 一个不错的文本编辑器或 IDE

  • 安装了 JDK 1.7 或更高版本,并已适当地配置了 JAVA_HOME

2.2 如何完成指南

要开始,请执行以下操作

Grails 指南存储库包含两个文件夹

  • initial 通常是一个简单的 Grails 应用程序,其中包含一些其他代码,以便为你提供先机。

  • complete

在本指南中,你将创建 Grails 应用程序。complete 应用程序是一个已完成的示例。这是完成指南介绍的步骤,并将这些更改应用到 initial 文件夹中的结果。

要完成该指南,请转到 initial 文件夹

  • grails-guides/grails-javamelody/initialcdgrails-guides/grails-javamelody/initial

并按照下一节中的说明进行操作。

如果你在 grails-guides/grails-javamelody/completecd,则可以直接转到 已完成的示例

3 应用程序概述

在本指南中,我们将监控添加到应用程序中,以便收集有关应用程序执行方式的统计信息。首先,我们将构建一个列出书籍及其详细信息的应用程序,然后添加监控并讨论我们可以使用监控做什么。

3.1 书籍应用程序

我们已经将基础应用程序放在 initial 文件夹中。

要快速介绍如何创建应用程序,我们首先需要添加 Book 域。

grails-app/domain/demo/Book.groovy
package demo

import grails.compiler.GrailsCompileStatic

@GrailsCompileStatic
class Book {
    String image
    String title
    String author
    String about
    String href
    static mapping = {
        about type: 'text'
    }
}

主页显示书籍列表。我们只需要每本书的一部分数据。即唯一标识符和书籍封面图片。在 src/main/groovy 目录中创建 Groovy POGO 来封装此信息

src/main/groovy/demo/BookImage.groovy
package demo

import groovy.transform.CompileStatic

@CompileStatic
class BookImage {
    Long id
    String image
}

Book 创建默认 CRUD 操作,利用 GORM 数据服务

grails-app/services/demo/BookDataService.groovy
package demo

import grails.gorm.services.Service
import grails.gorm.transactions.ReadOnly
import groovy.transform.CompileDynamic
import groovy.transform.CompileStatic
import org.grails.datastore.mapping.query.api.BuildableCriteria
import org.hibernate.transform.Transformers

interface IBookDataService {
    Book save(String title, String author, String about, String href, String image)
    Number count()
    Book findById(Long id)
}

@Service(Book)
abstract class BookDataService implements IBookDataService {

    @CompileDynamic
    @ReadOnly
    List<BookImage> findAll() {
        BuildableCriteria c = Book.createCriteria()
        c.list {
            resultTransformer(Transformers.aliasToBean(BookImage))
            projections {
                property('id', 'id')
                property('image', 'image')
            }
        }
    }
}

接下来,创建消耗我们刚刚创建的服务的控制器。我们的索引将利用我们的自定义 findAll 来返回书籍的完整列表,而我们的演出将利用数据服务 findById

grails-app/controllers/demo/BookController.groovy
package demo

import groovy.transform.CompileStatic

@CompileStatic
class BookController {

    static allowedMethods = [index: 'GET', show: 'GET']

    BookDataService bookDataService

    def index() {
        [bookList: bookDataService.findAll()]
    }

    def show(Long id) {
        [bookInstance: bookDataService.findById(id)]
    }

}

然后,我们需要使用 Bootstrap.groovy 实际创建图书数据

grails-app/init/demo/Bootstrap.groovy
package demo

import groovy.transform.CompileStatic

@CompileStatic
class BootStrap {

    public final static List< Map<String, String> > GRAILS_BOOKS = [
            [
                    title : 'Grails 3 - Step by Step',
                    author: 'Cristian Olaru',
                    href: 'https://grailsthreebook.com/',
                    about : 'Learn how a complete greenfield application can be implemented quickly and efficiently with Grails 3 using profiles and plugins. Use the sample application that accompanies the book as an example.',
                    image: 'grails_3_step_by_step.png',
            ],
            [
                    title : 'Practical Grails 3',
                    author: ' Eric Helgeson',
                    href  : 'https://www.grails3book.com/',
                    about : 'Learn the fundamental concepts behind building Grails applications with the first book dedicated to Grails 3. Real, up-to-date code examples are provided, so you can easily follow along.',
                    image: 'pratical-grails-3-book-cover.png',
            ],
            [
                    title : 'Falando de Grails',
                    author: 'Henrique Lobo Weissmann',
                    href  : 'http://www.casadocodigo.com.br/products/livro-grails',
                    about : 'This is the best reference on Grails 2.5 and 3.0 written in Portuguese. It&#39;s a great guide to the framework, dealing with details that many users tend to ignore.',
                    image: 'grails_weissmann.png',
            ],
            [
                    title : 'Grails Goodness Notebook',
                    author: 'Hubert A. Klein Ikkink',
                    href  : 'https://leanpub.com/grails-goodness-notebook',
                    about : 'Experience the Grails framework through code snippets. Discover (hidden) Grails features through code examples and short articles. The articles and code will get you started quickly and provide deeper insight into Grails.',
                    image: 'grailsgood.png',
            ],
            [
                    title : 'The Definitive Guide to Grails 2',
                    author: 'Jeff Scott Brown and Graeme Rocher',
                    href  : 'http://www.apress.com/9781430243779',
                    about : 'As the title states, this is the definitive reference on the Grails framework, authored by core members of the development team.',
                    image: 'grocher_jbrown_cover.jpg',
            ],
            [
                    title : 'Grails in Action',
                    author: 'Glen Smith and Peter Ledbrook',
                    href  : 'http://www.manning.com/gsmith2/',
                    about : 'The second edition of Grails in Action is a comprehensive introduction to Grails 2 focused on helping you become super-productive fast.',
                    image: 'gsmith2_cover150.jpg',
            ],
            [
                    title : 'Grails 2: A Quick-Start Guide',
                    author: 'Dave Klein and Ben Klein',
                    href  : 'http://www.amazon.com/gp/product/1937785777?tag=misa09-20',
                    about : 'This revised and updated edition shows you how to use Grails by iteratively building a unique, working application.',
                    image : 'bklein_cover.jpg',
            ],
            [
                    title : 'Programming Grails',
                    author: 'Burt Beckwith',
                    href  : 'http://shop.oreilly.com/product/0636920024750.do',
                    about : 'Dig deeper into Grails architecture and discover how this application framework works its magic.',
                    image: 'bbeckwith_cover.gif'
            ]
    ] as List< Map<String, String> >

    public final static List< Map<String, String> > GROOVY_BOOKS = [
            [
                    title: 'Making Java Groovy',
                    author: 'Ken Kousen',
                    href: 'http://www.manning.com/kousen/',
                    about: 'Make Java development easier by adding Groovy. Each chapter focuses on a task Java developers do, like building, testing, or working with databases or restful web services, and shows ways Groovy can make those tasks easier.',
                    image: 'Kousen-MJG.png',
            ],
            [
                    title: 'Groovy in Action, 2nd Edition',
                    author: 'Dierk König, Guillaume Laforge, Paul King, Cédric Champeau, Hamlet D\'Arcy, Erik Pragt, and Jon Skeet',
                    href: 'http://www.manning.com/koenig2/',
                    about: 'This is the undisputed, definitive reference on the Groovy language, authored by core members of the development team.',
                    image: 'regina.png',
            ],
            [
                    title: 'Groovy for Domain-Specific Languages',
                    author: 'Fergal Dearle',
                    href: 'http://www.packtpub.com/groovy-for-domain-specific-languages-dsl/book',
                    about: 'Learn how Groovy can help Java developers easily build domain-specific languages into their applications.',
                    image: 'gdsl.jpg',
            ],
            [
                    title: 'Groovy 2 Cookbook',
                    author: 'Andrey Adamovitch, Luciano Fiandeso',
                    href: 'http://www.packtpub.com/groovy-2-cookbook/book',
                    about: 'This book contains more than 90 recipes that use the powerful features of Groovy 2 to develop solutions to everyday programming challenges.',
                    image: 'g2cook.jpg',
            ],
            [
                    title: 'Programming Groovy 2',
                    author: 'Venkat Subramaniam',
                    href: 'http://pragprog.com/book/vslg2/programming-groovy-2',
                    about: 'This book helps experienced Java developers learn to use Groovy 2, from the basics of the language to its latest advances.',
                    image: 'vslg2.jpg'
            ],
    ] as List< Map<String, String> >

    BookDataService bookDataService

    def init = { servletContext ->
        for (Map<String, String> bookInfo : (GRAILS_BOOKS + GROOVY_BOOKS)) {
            bookDataService.save(bookInfo.title, bookInfo.author, bookInfo.about, bookInfo.href, bookInfo.image)
        }
    }

    def destroy = {
    }
}

最后,我们更新 URL 映射,以便默认端点 / 显示书籍列表。

grails-app/controllers/demo/UrlMappings.groovy
package demo

class UrlMappings {

    static mappings = {
        "/$controller/$action?/$id?(.$format)?"{
            constraints {
                // apply constraints here
            }
        }

        "/"(controller: "book") (1)
        "500"(view:'/error')
        "404"(view:'/notFound')
    }
}
1 更新的默认 URL

运行应用程序

$ ./gradlew bootRun
booksHome

4 添加 Melody

使用 JavaMelody 监控应用程序。首先,添加所需的依赖项。

build.gradle
compile 'org.grails.plugins:grails-melody-plugin:1.70.0'

有时,在使用 Grails 插件时,你需要升级插件作者尚未升级的传递依赖项。如果你运行 gradle 任务 dependencies,你将看到下一个依赖图。

\--- org.grails.plugins:grails-melody-plugin:1.70.0
     +--- net.bull.javamelody:javamelody-core:1.70.0
     |    \--- org.jrobin:jrobin:1.5.9
     +--- com.lowagie:itext:2.1.7
     \--- org.jrobin:jrobin:1.5.9

你可以轻松升级到 Java Melody 1.71.0 的最新版本

build.gradle
compile('org.grails.plugins:grails-melody-plugin:1.70.0') {
    exclude group: 'net.bull.javamelody', module: 'javamelody-core'
}
compile 'net.bull.javamelody:javamelody-core:1.71.0'

并且 …​ 而已,现在已将 JavaMelody 添加到我们的应用程序中,重启应用程序,然后导航到 http://localhost:8080/monitoring,你应该看到以下内容。

melodyHome

此时,点击应用程序中的各个选项卡,然后返回到 JavaMelody 主页并展开详细信息,以查看它在应用程序中捕获了你的活动。默认情况下,JavaMelody 查看你的 URI 以解析 HTTP 请求。这意味着 /book/1/book/6 将分别列出。

melodyIndependentMonitoring

如果你不想为每一本书获取单独的统计信息,而是获取书籍详细端点的聚合,你可以告诉 JavaMelody 报告请求的聚合。在我们的 application.yml. 中添加以下内容

grails-app/conf/application.yml
javamelody:
    # filter out numbers from URI
    http-transform-pattern: \d+

现在,重启应用程序一次,以便它获取到配置更改。然后执行与上次相同操作,浏览几本不同的书,然后返回到http://localhost:8080/monitoring。展开详细信息,以便查看跨多个请求的聚合数据。

melodyCombinedMonitoring

从主屏幕,您可以轻松地通过选择DayWeekMonthYearAll筛选不同时段内的应用程序统计信息,或定义一个用于查看统计信息的Customized范围。此外,如果您想获取所有 JavaMelody 指标以便离线查看,请单击 PDF 按钮下载一个副本。

如果您想实现轻松启用和禁用 JavaMelody 的功能,只需将以下内容添加到您的application.yml即可,以便轻松地开关监控。

grails-app/conf/application.yml
javamelody:
    disabled: true

与 HTTP 请求类似,您可以聚合 SQL 监控的统计信息。将以下内容添加到您的application.yml

grails-app/conf/application.yml
javamelody:
    sql-transform-pattern: \d+

如果您在同一个应用程序中使用 Spring Security Core 和 Java Melody 插件,则需要为 /monitoring 端点配置安全访问。

grails-app/conf/application.yml
grails:
  plugin:
    springsecurity:
      controllerAnnotations:
        staticRules:
          -
            pattern: /monitoring
            access:
              - ROLE_ADMIN

将先前的配置添加到application.yml意味着您需要使用具有ROLE_ADMIN访问权限的用户进行身份验证,才能访问/monitoring

5 后续步骤

若要进一步加深您的理解,请仔细阅读 Java Melody 的项目文档,此外,请随时浏览 维基。如果您有更高级的需求,请查看 Java Melody 用户高级指南

6 是否需要 Grails 方面的帮助?

Object Computing, Inc. (OCI) 赞助创建本指南。我们提供各种咨询和支持服务。

OCI 是 Grails 的家园

认识团队