Spring Boot アプリケーションで jmx を使用して jolokia をセットアップしたので、HTTP 経由で jmx 情報を取得できます。
ただし、「要求されたリソースに 'Access-Control-Allow-Origin' ヘッダーが存在しません。したがって、Origin ' http://localhost:8080 ' はアクセスを許可されていません」というエラーが表示され、javascript ajax でデータを取得できません。
jolokia エンドポイントが 'Access-Control-Allow-Origin: *' ヘッダーを返して任意のオリジンを許可するようにしたい、または少なくとも jolokia-access.xml で指定した許可されたオリジンのヘッダーを返すようにしたいのですが、ヘッダーが取得されません応答があり、何を見逃したのかわかりません
スクリプトをリモートで実行したいので、私が実行しているモニタリング JavaScript は、私のスプリング ブート アプリケーションがある同じサーバー上にはありません。
以下は私のスプリングブートアプリケーションのセットアップです。
application.properties と jolokia-access.xml の両方がクラスパスにあるため、application.properties の management.port に対して行った変更と、jolokia-access.xml のリモート ポスト アクセス制限が適用されていることがわかります。
pom.xml
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.2.4.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.jolokia</groupId>
<artifactId>jolokia-core</artifactId>
</dependency>
:
アプリケーションのプロパティ
management.port=8888
endpoints.jolokia.path=/jolokia
endpoints.jolokia.enabled=true
endpoints.jmx.enabled=true
endpoints.cors.allowed-origins=*
endpoints.cors.allowed-methods=*
endpoints.cors.allowed-headers=*
jolokia-access.xml
<?xml version="1.0" encoding="UTF-8"?>
<restrict>
<remote>
<host>127.0.0.1</host>
<host>localhost</host>
</remote>
<http>
<method>post</method>
<method>get</method>
</http>
<commands>
<command>read</command>
<command>list</command>
<command>version</command>
</commands>
<cors>
<allow-origin>http://localhost:*</allow-origin>
<allow-origin>http://127.0.0.1:*</allow-origin>
</cors>
</restrict>
curl で jolokia エンドポイントにヒットすると、以下のように json として応答に jmx データを含めることができます
$ curl -X POST http://127.0.0.1:8888/jolokia -d '{
"type":"read",
"mbean":"org.springframework.boot:type=Endpoint,name=healthEndpoint",
"attribute":"Data"
}'
{"request":{"mbean":"org.springframework.boot:name=healthEndpoint,type=Endpoint","attribute":"Data","type":"read"},
"value":{"diskSpace":{"threshold":10485760,"free":204441415680,"status":"UP"},"db":{"database":"H2","hello":1,"status":"UP"},"status":"UP"},
"timestamp":1433908260,"status":200}
$ curl -X POST http://127.0.0.1:8888/jolokia -d '{
"type":"read",
"mbean":"java.lang:type=Memory",
"attribute":"HeapMemoryUsage",
"path":"used"
}'
{"request":{"path":"used","mbean":"java.lang:type=Memory","attribute":"HeapMemoryUsage","type":"read"},
"value":69036712,"timestamp":1434075946,"status":200}
ただし、 jolokia エンドポイントからの応答に Access-Control-Allow-Origin ヘッダーがないため、以下の javascipt は失敗しました。「endpoints.cors.allowed-origins=*」プロパティをセットアップしても、応答にヘッダーが表示されません
JavaScript の監視
var j4p = new Jolokia({url: "http://127.0.0.1:8888/jolokia", fetchInterval: 1000});
var context = cubism.context()
.serverDelay(0)
.clientDelay(0)
.step(1000)
.size(594);
var jolokia = context.jolokia(j4p);
var memory = jolokia.metric(
function (resp1, resp2) {
return Number(resp1.value) / Number(resp2.value);
},
{type:"read", mbean:"java.lang:type=Memory", attribute:"HeapMemoryUsage", path:"used"},
{type:"read", mbean:"java.lang:type=Memory", attribute:"HeapMemoryUsage", path:"max"}, "Heap-Memory"
);
JavaScript が送信した要求ヘッダー
Accept:*/*
Accept-Encoding:gzip, deflate, sdch
Accept-Language:en-US,en;q=0.8
Access-Control-Request-Headers:accept, content-type
Access-Control-Request-Method:POST
Connection:keep-alive
Host:127.0.0.1:8888
Origin:http://127.0.0.1:8080
Referer:http://127.0.0.1:8080/monitor/
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.124 Safari/537.36
JavaScript が受け取った応答ヘッダー
Allow:GET, HEAD, POST, PUT, DELETE, TRACE, OPTIONS, PATCH
Cache-Control:no-cache, no-store, max-age=0, must-revalidate
Content-Length:0
Date:Fri, 12 Jun 2015 02:27:17 GMT
Expires:0
Pragma:no-cache
Server:Jetty(9.2.10.v20150310)
X-Content-Type-Options:nosniff
X-Frame-Options:DENY
X-XSS-Protection:1; mode=block
上記のように、「Access-Control-Allow-Origin」ヘッダーはまったくありません。