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 如何完成指南
要开始,请执行以下操作
-
下载并解压源代码
或
-
克隆 Git 存储库
git clone https://github.com/grails-guides/grails-javamelody.git
Grails 指南存储库包含两个文件夹
-
initial
通常是一个简单的 Grails 应用程序,其中包含一些其他代码,以便为你提供先机。 -
complete
在本指南中,你将创建 Grails 应用程序。complete
应用程序是一个已完成的示例。这是完成指南介绍的步骤,并将这些更改应用到 initial
文件夹中的结果。
要完成该指南,请转到 initial
文件夹
-
在
grails-guides/grails-javamelody/initial
中cd
到grails-guides/grails-javamelody/initial
并按照下一节中的说明进行操作。
如果你在 grails-guides/grails-javamelody/complete 中 cd ,则可以直接转到 已完成的示例。 |
3 应用程序概述
在本指南中,我们将监控添加到应用程序中,以便收集有关应用程序执行方式的统计信息。首先,我们将构建一个列出书籍及其详细信息的应用程序,然后添加监控并讨论我们可以使用监控做什么。
3.1 书籍应用程序
我们已经将基础应用程序放在 initial 文件夹中。 |
要快速介绍如何创建应用程序,我们首先需要添加 Book
域。
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 来封装此信息
package demo
import groovy.transform.CompileStatic
@CompileStatic
class BookImage {
Long id
String image
}
为 Book
创建默认 CRUD 操作,利用 GORM 数据服务。
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
。
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
实际创建图书数据
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'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 映射,以便默认端点 /
显示书籍列表。
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
4 添加 Melody
使用 JavaMelody 监控应用程序。首先,添加所需的依赖项。
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 的最新版本
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
,你应该看到以下内容。
此时,点击应用程序中的各个选项卡,然后返回到 JavaMelody 主页并展开详细信息,以查看它在应用程序中捕获了你的活动。默认情况下,JavaMelody 查看你的 URI 以解析 HTTP 请求。这意味着 /book/1
和 /book/6
将分别列出。
如果你不想为每一本书获取单独的统计信息,而是获取书籍详细端点的聚合,你可以告诉 JavaMelody 报告请求的聚合。在我们的 application.yml.
中添加以下内容
javamelody:
# filter out numbers from URI
http-transform-pattern: \d+
现在,重启应用程序一次,以便它获取到配置更改。然后执行与上次相同操作,浏览几本不同的书,然后返回到http://localhost:8080/monitoring
。展开详细信息,以便查看跨多个请求的聚合数据。
从主屏幕,您可以轻松地通过选择Day
、Week
、Month
、Year
、All
筛选不同时段内的应用程序统计信息,或定义一个用于查看统计信息的Customized
范围。此外,如果您想获取所有 JavaMelody 指标以便离线查看,请单击 PDF 按钮下载一个副本。
如果您想实现轻松启用和禁用 JavaMelody 的功能,只需将以下内容添加到您的application.yml
即可,以便轻松地开关监控。
javamelody:
disabled: true
与 HTTP 请求类似,您可以聚合 SQL 监控的统计信息。将以下内容添加到您的application.yml
。
javamelody:
sql-transform-pattern: \d+
如果您在同一个应用程序中使用 Spring Security Core 和 Java Melody 插件,则需要为 /monitoring
端点配置安全访问。
grails:
plugin:
springsecurity:
controllerAnnotations:
staticRules:
-
pattern: /monitoring
access:
- ROLE_ADMIN
将先前的配置添加到application.yml
意味着您需要使用具有ROLE_ADMIN
访问权限的用户进行身份验证,才能访问/monitoring
。
5 后续步骤
若要进一步加深您的理解,请仔细阅读 Java Melody 的项目文档,此外,请随时浏览 维基。如果您有更高级的需求,请查看 Java Melody 用户高级指南。