{"id":271,"date":"2023-01-28T11:45:26","date_gmt":"2023-01-28T02:45:26","guid":{"rendered":"https:\/\/hirabay.net\/?p=271"},"modified":"2023-03-12T16:11:43","modified_gmt":"2023-03-12T07:11:43","slug":"springboot%e3%82%a2%e3%83%97%e3%83%aa%e3%82%b1%e3%83%bc%e3%82%b7%e3%83%a7%e3%83%b3%e3%81%ae%e3%83%a1%e3%83%88%e3%83%aa%e3%82%af%e3%82%b9%e7%9b%a3%e8%a6%96","status":"publish","type":"post","link":"https:\/\/hirabay.net\/?p=271","title":{"rendered":"SpringBoot\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u30e1\u30c8\u30ea\u30af\u30b9\u76e3\u8996"},"content":{"rendered":"\n<p>SpringBoot\u3067\u5b9f\u88c5\u3057\u305f\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3067\u300c\u30e1\u30c8\u30ea\u30af\u30b9\u3067\u76e3\u8996\u3057\u3088\u3046\uff01\u300d\u3068\u306f\u601d\u3063\u305f\u3082\u306e\u306e\u3001<br>\u300c\u4f55\u3092\u898b\u305f\u3089\u3044\u3044\u3093\u3060\u2026\u300d\u3068\u306a\u3063\u3066\u3044\u306a\u3044\u3067\u3057\u3087\u3046\u304b\uff1f<\/p>\n\n\n\n<p>\u50d5\u3082\u4ee5\u524d\u306f\u540c\u3058\u72b6\u6cc1\u3060\u3063\u305f\u306e\u3067\u3059\u304c\u3001\uff13\u5e74\u307b\u3069\u304b\u3051\u3066\u30e1\u30c8\u30ea\u30af\u30b9\u76e3\u8996\u3067\u306e\u904b\u7528\u3092\u7d9a\u3051\u308b\u4e2d\u3067\u81ea\u5206\u306a\u308a\u306e\u6b63\u89e3\u3092\u898b\u3064\u3051\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3057\u305f\u3002<\/p>\n\n\n\n<p>\u3053\u306e\u8a18\u4e8b\u3067\u306f\u305d\u306e\uff13\u5e74\u3067\u5b66\u3093\u3060\u3053\u3068\u3092\u51dd\u7e2e\u3057\u3001\u3053\u306e\u8a18\u4e8b\u3092\u8aad\u3093\u3067\u304f\u3060\u3055\u3063\u305f\u65b9\u304c\u4eca\u3059\u3050\u306b\u5b9f\u884c\u306b\u79fb\u305b\u308b\u3088\u3046\u307e\u3068\u3081\u3066\u307f\u307e\u3057\u305f\uff01<\/p>\n\n\n<p><\/p><div class=\"memo \"><div class=\"memo_ttl dfont\"> \u88dc\u8db3<\/div>\u30ad\u30e3\u30d1\u30b7\u30c6\u30a3\u30d7\u30e9\u30f3\u30cb\u30f3\u30b0\u306e\u305f\u3081\u306b\u3001<br>\n\u6700\u5927\u30b9\u30ec\u30c3\u30c9\u6570\u3084\u6700\u5927\u30b3\u30cd\u30af\u30b7\u30e7\u30f3\u6570\u306e\u5909\u66f4\u306e\u4ed5\u65b9\u306b\u3082\u89e6\u308c\u3066\u3044\u304d\u307e\u3059\uff01<\/div>\n\n\n\n<div class=\"toc\"><br \/>\n<b>Warning<\/b>:  Undefined array key \"is_admin\" in <b>\/home\/c4179872\/public_html\/hirabay.net\/wp-content\/themes\/sango-theme\/library\/gutenberg\/dist\/classes\/Toc.php<\/b> on line <b>110<\/b><br \/>\n<br \/>\n<b>Warning<\/b>:  Undefined array key \"is_category_top\" in <b>\/home\/c4179872\/public_html\/hirabay.net\/wp-content\/themes\/sango-theme\/library\/gutenberg\/dist\/classes\/Toc.php<\/b> on line <b>115<\/b><br \/>\n<br \/>\n<b>Warning<\/b>:  Undefined array key \"is_top\" in <b>\/home\/c4179872\/public_html\/hirabay.net\/wp-content\/themes\/sango-theme\/library\/gutenberg\/dist\/classes\/Toc.php<\/b> on line <b>122<\/b><br \/>\n    <div id=\"toc_container\" class=\"sgb-toc--bullets js-smooth-scroll\">\n      <p class=\"toc_title\">\u76ee\u6b21 <\/p>\n      <ul class=\"toc_list\">\n  <li class=\"first\">\n    <a href=\"#i-0\">\u6e96\u5099<\/a>\n  <\/li>\n  <li>\n    <a href=\"#i-1\">HTTP\u30b5\u30fc\u30d0<\/a>\n    <ul class=\"menu_level_1\">\n      <li class=\"first last\">\n        <a href=\"#i-2\">Tomcat<\/a>\n      <\/li>\n    <\/ul>\n  <\/li>\n  <li>\n    <a href=\"#i-3\">HTTP\u30af\u30e9\u30a4\u30a2\u30f3\u30c8<\/a>\n    <ul class=\"menu_level_1\">\n      <li class=\"first\">\n        <a href=\"#i-4\">RestTemplate<\/a>\n      <\/li>\n      <li class=\"last\">\n        <a href=\"#i-5\">WebClient<\/a>\n      <\/li>\n    <\/ul>\n  <\/li>\n  <li class=\"last\">\n    <a href=\"#i-6\">\u756a\u5916\u7de8<\/a>\n  <\/li>\n<\/ul>\n\n      \n    <\/div><\/div><h2 class=\"wp-block-heading\" id=\"i-0\">\u6e96\u5099<\/h2>\n\n\n\n<p>\u30e1\u30c8\u30ea\u30af\u30b9\u306e\u53d6\u5f97\u306e\u305f\u3081\u306b\u5171\u901a\u7684\u306b\u5fc5\u8981\u306a\u6e96\u5099\u3067\u3059\u3002<\/p>\n\n\n\n<p>\u3053\u306e\u8a18\u4e8b\u3067\u306fprometheus\u3067\u8aad\u307f\u53d6\u308b\u3053\u3068\u3092\u524d\u63d0\u306b\u9032\u3081\u307e\u3059\u3002<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism undefined-numbers lang-groovy\" data-file=\"build.gradle\" data-lang=\"Groovy\"><code>plugins {\n\t...\n  \/\/ SpringBoot\u306e\u30d0\u30fc\u30b8\u30e7\u30f3\u306f\u300c3.0.2\u300d\u3067\n\tid 'org.springframework.boot' version '3.0.2'\n\tid 'io.spring.dependency-management' version '1.1.0'\n}\n\n...\n\ndependencies {\n  ...\n  \/\/ \uff08\u5fc5\u9808\uff09\u30e1\u30c8\u30ea\u30af\u30b9\u53ce\u96c6\u306e\u30e1\u30a4\u30f3\u3092\u62c5\u3046\u30e9\u30a4\u30d6\u30e9\u30ea\n\timplementation 'org.springframework.boot:spring-boot-starter-actuator'\n  \/\/ \u30e1\u30c8\u30ea\u30af\u30b9\u3092prometheus\u3067\u8aad\u307f\u53d6\u308c\u308b\u5f62\u5f0f\u3067\u51fa\u529b\u3059\u308b\u305f\u3081\u306e\u30e9\u30a4\u30d6\u30e9\u30ea\n\timplementation 'io.micrometer:micrometer-registry-prometheus'\n}<\/code><\/pre><\/div>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism undefined-numbers lang-yaml\" data-file=\"application.yaml\" data-lang=\"Yaml\"><code>management:\n  server:\n    # \uff08\u4efb\u610f\uff09\u30e1\u30c8\u30ea\u30af\u30b9\u3092\u51fa\u529b\u3059\u308bport\u3092\u5909\u66f4\u3059\u308b\n    # \u203b\u30a8\u30f3\u30c9\u30dd\u30a4\u30f3\u30c8\u3055\u3048\u77e5\u3063\u3066\u3044\u308c\u3070\u5916\u304b\u3089\u53e9\u3051\u3066\u3057\u307e\u3046\u306e\u3067\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u30dd\u30fc\u30c8\u3068\u5225\u306b\u3059\u308b\u306e\u304c\u30aa\u30b9\u30b9\u30e1\n    port: 9990\n  endpoints:\n    web:\n      exposure:\n        # \u6709\u52b9\u5316\u3057\u305f\u3044\u30a8\u30f3\u30c9\u30dd\u30a4\u30f3\u30c8\u3092\u8a18\u8f09\uff08\u3053\u3053\u3067\u306fprometheus\u3092\u8ffd\u52a0\uff09\n        include: health, prometheus<\/code><\/pre><\/div>\n\n\n\n<p>\u3053\u308c\u3067\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u8d77\u52d5\u3057\u3001<a href=\"http:\/\/localhost:9990\/actuator\/prometheus\" target=\"_blank\" rel=\"noreferrer noopener\">http:\/\/localhost:9990\/actuator\/prometheus<\/a> \u306b\u30a2\u30af\u30bb\u30b9\u3059\u308b\u3068\u30e1\u30c8\u30ea\u30af\u30b9\u3092\u53c2\u7167\u3067\u304d\u307e\u3059\uff01<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-1\">HTTP\u30b5\u30fc\u30d0<\/h2>\n\n\n\n<p><code>spring-boot-starter-web<\/code>\u3001<code>spring-boot-starter-webflux<\/code>\u3092\u4f7f\u7528\u3057\u3066HTTP\u30ea\u30af\u30a8\u30b9\u30c8\u3092\u53d7\u3051\u53d6\u308b\u5834\u5408\u3001<br>\u30c7\u30d5\u30a9\u30eb\u30c8\u3067\u30e1\u30c8\u30ea\u30af\u30b9\u3092\u53d6\u5f97\u3067\u304d\u307e\u3059\u304c\u3001\u30d1\u30fc\u30bb\u30f3\u30bf\u30a4\u30eb\u306e\u53d6\u5f97\u306e\u305f\u3081\u306b\u4ee5\u4e0b\u306e\u8a2d\u5b9a\u3092\u3057\u3066\u304a\u304f\u3068\u3088\u3044\u3067\u3059\u3002<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism undefined-numbers lang-yaml\" data-file=\"application.yaml\" data-lang=\"Yaml\"><code>management:\n  metrics:\n    distribution:\n      percentiles:\n        # \u53d6\u5f97\u3059\u308b\u30d1\u30fc\u30bb\u30f3\u30bf\u30a4\u30eb\u306e\u8a2d\u5b9a\uff08\u3053\u306e\u4f8b\u3060\u306850%ile\u306899%ile\uff09\n        \"http.server.requests\": 0.5,0.99\n  observations:\n    http:\n      server:\n        requests:\n          # \uff08\u4efb\u610f\uff09\u30e1\u30c8\u30ea\u30af\u30b9\u540d\u3092\u6307\u5b9a\n          name: \"http.server.requests\"<\/code><\/pre><\/div>\n\n\n\n<p>\u898b\u308b\u3079\u304d\u30e1\u30c8\u30ea\u30af\u30b9\u306f\u3053\u3061\u3089\uff01<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>http_server_requests_seconds<\/code>\n<ul class=\"wp-block-list\">\n<li>\u30ec\u30b9\u30dd\u30f3\u30b9\u306e\u30d1\u30fc\u30bb\u30f3\u30bf\u30a4\u30eb\u3092\u8fd4\u3059\u30e1\u30c8\u30ea\u30af\u30b9\u3067\u3059<\/li>\n\n\n\n<li>\u5e73\u5747\u3060\u3068\u4e00\u90e8\u306e\u9045\u3044\u30ea\u30af\u30a8\u30b9\u30c8\u304c\u4e38\u3081\u8fbc\u307e\u308c\u3066\u3057\u307e\u3046\u305f\u3081<strong><span class=\"keiko_yellow\">99%ile\u7b49\u3067\u30ec\u30b9\u30dd\u30f3\u30b9\u3092\u628a\u63e1<\/span><\/strong>\u3059\u308b\u306e\u304c\u30aa\u30b9\u30b9\u30e1\u3067\u3059<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><code>http_server_requests_seconds_count<\/code>\n<ul class=\"wp-block-list\">\n<li>\u7d2f\u7a4d\u306eHTTP\u30ea\u30af\u30a8\u30b9\u30c8\u6570\u3092\u8fd4\u3059\u30e1\u30c8\u30ea\u30af\u30b9\u3067\u3059<\/li>\n\n\n\n<li>Prometheus\u3067\u3044\u3046<code>irate<\/code>\u306e\u3088\u3046\u306a\u4e00\u5b9a\u671f\u9593\u306e\u5dee\u5206\u3092\u6c42\u3081\u308b\u95a2\u6570\u3068\u5408\u308f\u305b\u3066\u5229\u7528\u3059\u308b\u3053\u3068\u3067rps\u3092\u628a\u63e1\u3067\u304d\u307e\u3059<\/li>\n\n\n\n<li>\u307e\u305fHTTP\u30b9\u30c6\u30fc\u30bf\u30b9\u304c\u30bf\u30b0\u306b\u542b\u307e\u308c\u308b\u305f\u3081\u3001\u30a8\u30e9\u30fc\u4ef6\u6570\u3084\u30a8\u30e9\u30fc\u5272\u5408\u306a\u3093\u304b\u3082\u628a\u63e1\u3067\u304d\u307e\u3059<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-2\">Tomcat<\/h3>\n\n\n\n<p><code>spring-boot-starter-web<\/code>\u3092\u4f7f\u7528\u3057\u3066\u3044\u308b\u5834\u5408\u3001\u7279\u306b\u8a2d\u5b9a\u3092\u5909\u3048\u306a\u3044\u9650\u308aTomcat\u3067\u30b5\u30fc\u30d0\u304c\u8d77\u52d5\u3057\u3066\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<p>Tomcat\u306f\uff11\u30b9\u30ec\u30c3\u30c9\u3067\uff11\u30ea\u30af\u30a8\u30b9\u30c8\u3092\u3055\u3070\u304f\u4ed5\u69d8\u306e\u305f\u3081\u7279\u306b<strong><span class=\"keiko_yellow\">\u300c\u6700\u5927\u30b9\u30ec\u30c3\u30c9\u6570\u300d<\/span><\/strong>\u3068<strong><span class=\"keiko_yellow\">\u300c\u5229\u7528\u4e2d\u306e\u30b9\u30ec\u30c3\u30c9\u6570\u300d<\/span><\/strong>\u306f\u628a\u63e1\u3057\u3066\u304a\u3044\u305f\u65b9\u304c\u826f\u3044\u3068\u601d\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u30e1\u30c8\u30ea\u30af\u30b9\u306e\u53d6\u5f97\u65b9\u6cd5\u3067\u3059\u304c\u3001<code>application.yaml<\/code>\u3067\u8a2d\u5b9a\u3092\u5909\u66f4\u3059\u308b\u3060\u3051\u3067\u3059\uff01<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism undefined-numbers lang-yaml\" data-lang=\"Yaml\"><code>server:\n  tomcat:\n    mbeanregistry:\n      # Tomcat\u306e\u30e1\u30c8\u30ea\u30af\u30b9\u53ce\u96c6\u3092\u6709\u52b9\u5316\n      enabled: true\n    threads:\n      # \u6700\u5927\u30b9\u30ec\u30c3\u30c9\u6570\u306e\u8a2d\u5b9a\uff08\u30c7\u30d5\u30a9\u30eb\u30c8:200\uff09\n      max: 500<\/code><\/pre><\/div>\n\n\n\n<p>\u898b\u308b\u3079\u304d\u30e1\u30c8\u30ea\u30af\u30b9\u306f\u3053\u3061\u3089\uff01<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>tomcat_threads_current_threads<\/code>\n<ul class=\"wp-block-list\">\n<li><code>tomcat_threads_busy_threads<\/code>\u304c\u4f7f\u7528\u4e2d\u306e\u30b9\u30ec\u30c3\u30c9\u6570\u3092\u8fd4\u3059\u306e\u306b\u5bfe\u3057\u3066\u3001\u4f7f\u7528\u4e2d\u4ee5\u5916\u3082\u542b\u3081\u3066\u8fd4\u3059\u30e1\u30c8\u30ea\u30af\u30b9<\/li>\n\n\n\n<li>busy\u306e\u65b9\u3088\u308a\u3082\u6700\u5927\u3067\u3069\u308c\u3060\u3051\u306e\u30b9\u30ec\u30c3\u30c9\u3092\u5229\u7528\u3057\u305f\u306e\u304b\u306e\u628a\u63e1\u304c\u3057\u3084\u3059\u3044\u3067\u3059<\/li>\n\n\n\n<li>\u203bbusy\u306e\u65b9\u3060\u3068\u6700\u5927\u5229\u7528\u6642\u30d4\u30f3\u30dd\u30a4\u30f3\u30c8\u3067\u30e1\u30c8\u30ea\u30af\u30b9\u6392\u51fa\u3057\u306a\u3044\u3068\u30c0\u30e1<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><code>tomcat_threads_config_max_threads<\/code>\n<ul class=\"wp-block-list\">\n<li>\u8a2d\u5b9a\u4e0a\u306e\u6700\u5927\u30b9\u30ec\u30c3\u30c9\u6570\u3067\u3059<\/li>\n\n\n\n<li>\u540c\u6642\u306b\u51e6\u7406\u3067\u304d\u308b\u30ea\u30af\u30a8\u30b9\u30c8\u6570\u3067\u3059<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-3\">HTTP\u30af\u30e9\u30a4\u30a2\u30f3\u30c8<\/h2>\n\n\n\n<p>\u4f7f\u7528\u3059\u308b\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u306e\u7a2e\u985e\u306b\u3088\u3063\u3066\u5b9f\u88c5\u65b9\u6cd5\u304c\u7570\u306a\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-4\">RestTemplate<\/h3>\n\n\n\n<p>RestTemplate\u3092\u5229\u7528\u3057\u3066\u3044\u308b\u5834\u5408\u3001RestTemplate\u751f\u6210\u6642\u306b\u30ab\u30b9\u30bf\u30de\u30a4\u30ba\u304c\u5fc5\u8981\u3067\u3059\uff01<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism undefined-numbers lang-java\" data-lang=\"Java\"><code>    @Bean\n    public PoolingHttpClientConnectionManager connectionManager() {\n        return PoolingHttpClientConnectionManagerBuilder.create()\n                .setMaxConnTotal(100)    \/\/ \u6700\u5927\u30b3\u30cd\u30af\u30b7\u30e7\u30f3\u6570\u3000\u203b\u30c7\u30d5\u30a9\u30eb\u30c8: 25\n                .setMaxConnPerRoute(50)  \/\/ \u30c9\u30e1\u30a4\u30f3\u3054\u3068\u306e\u6700\u5927\u30b3\u30cd\u30af\u30b7\u30e7\u30f3\u6570\u3000\u203b\u30c7\u30d5\u30a9\u30eb\u30c8: 5\n                .build();\n    }\n\n    @Bean\n    public RestTemplate myRestTemplate(\n            PoolingHttpClientConnectionManager connectionManager,\n            ObservationRestTemplateCustomizer observationRestTemplateCustomizer\n    ) {\n        var httpClient = HttpClients.custom()\n                .setConnectionManager(connectionManager)\n                .build();\n\n        var requestFactory = new HttpComponentsClientHttpRequestFactory();\n        requestFactory.setHttpClient(httpClient);\n\n        return new RestTemplateBuilder()\n                \/\/ HTTP\u901a\u4fe1\u306e\u30e1\u30c8\u30ea\u30af\u30b9\u53d6\u5f97\u306e\u305f\u3081\u306eCustomizer\n                \/\/ \uff08Spring\u304c\u63d0\u4f9b\u3057\u3066\u3044\u308bRestTemplateBuilder bean\u3092\u4f7f\u3046\u5834\u5408\u306f\u4e0d\u8981\uff09\n                .customizers(observationRestTemplateCustomizer)\n                \/\/ \u30ab\u30b9\u30bf\u30de\u30a4\u30ba\u3057\u305fHttpClient\u3092\u8a2d\u5b9a\u3059\u308b\n                .requestFactory(() -&gt; requestFactory)\n                .build();<\/code><\/pre><\/div>\n\n\n\n<p>\u898b\u308b\u3079\u304d\u30e1\u30c8\u30ea\u30af\u30b9\u306f\u3053\u3061\u3089\uff01<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>http_client_requests_seconds_count<\/code>\n<ul class=\"wp-block-list\">\n<li>\u7d2f\u7a4d\u306eHTTP\u30ea\u30af\u30a8\u30b9\u30c8\u6570\u3092\u8fd4\u3059\u30e1\u30c8\u30ea\u30af\u30b9\u3067\u3059<\/li>\n\n\n\n<li>Prometheus\u3067\u3044\u3046<code>irate<\/code>\u306e\u3088\u3046\u306a\u4e00\u5b9a\u671f\u9593\u306e\u5dee\u5206\u3092\u6c42\u3081\u308b\u95a2\u6570\u3068\u5408\u308f\u305b\u3066\u5229\u7528\u3059\u308b\u3053\u3068\u3067rps\u3092\u628a\u63e1\u3067\u304d\u307e\u3059<\/li>\n\n\n\n<li>\u307e\u305fHTTP\u30b9\u30c6\u30fc\u30bf\u30b9\u304c\u30bf\u30b0\u306b\u542b\u307e\u308c\u308b\u305f\u3081\u3001\u30a8\u30e9\u30fc\u4ef6\u6570\u3084\u30a8\u30e9\u30fc\u5272\u5408\u306a\u3093\u304b\u3082\u628a\u63e1\u3067\u304d\u307e\u3059<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><code>http_client_requests_seconds<\/code>\n<ul class=\"wp-block-list\">\n<li>\u30ec\u30b9\u30dd\u30f3\u30b9\u306e\u30d1\u30fc\u30bb\u30f3\u30bf\u30a4\u30eb\u3092\u8fd4\u3059\u30e1\u30c8\u30ea\u30af\u30b9\u3067\u3059<\/li>\n\n\n\n<li>\u5e73\u5747\u3060\u3068\u4e00\u90e8\u306e\u9045\u3044\u30ea\u30af\u30a8\u30b9\u30c8\u304c\u4e38\u3081\u8fbc\u307e\u308c\u3066\u3057\u307e\u3046\u305f\u3081<strong><span class=\"keiko_yellow\">99%ile\u7b49\u3067\u30ec\u30b9\u30dd\u30f3\u30b9\u3092\u628a\u63e1<\/span><\/strong>\u3059\u308b\u306e\u304c\u30aa\u30b9\u30b9\u30e1\u3067\u3059<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<p>httpclient5\u306e\u30b3\u30cd\u30af\u30b7\u30e7\u30f3\u6570\u306e\u30e1\u30c8\u30ea\u30af\u30b9\u306b\u3064\u3044\u3066\u306f\u5bfe\u5fdc\u4e2d\u306e\u3088\u3046\u3067\u3059\u3002<br>\u3059\u3050\u306b\u5fc5\u8981\u306a\u5834\u5408\u306f\u4ee5\u4e0b\u3092\u53c2\u8003\u306b\u500b\u5225\u3067\u5b9f\u88c5\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002<\/p>\n\n\n<p><\/p><div class=\"linkcard\"><div class=\"lkc-external-wrap\"><a class=\"lkc-link no_icon\" href=\"https:\/\/github.com\/micrometer-metrics\/micrometer\/pull\/3598\/files#diff-490f2c5ae7960227c94a928ebfbd4be703cf78eff1a633a391c55e82558f6a7d\" target=\"_blank\" rel=\"external noopener\"><div class=\"lkc-card\"><div class=\"lkc-info\"><img loading=\"lazy\" decoding=\"async\" class=\"lkc-favicon\" src=\"https:\/\/www.google.com\/s2\/favicons?domain=github.com\" alt=\"\" width=\"16\" height=\"16\"><div class=\"lkc-domain\">GitHub<\/div><\/div><div class=\"lkc-content\"><figure class=\"lkc-thumbnail\"><img decoding=\"async\" class=\"lkc-thumbnail-img\" src=\"\/\/hirabay.net\/wp-content\/uploads\/pz-linkcard\/cache\/a2fe222b873b60e7245e3b7caa7c28e5d5a11dc6bbc8527f6d4067f0421bdf0b.jpeg\" alt=\"\"><\/figure><div class=\"lkc-title\"><div class=\"lkc-title-text\">Support Apache HttpClient 5 by shakuzen \u00b7 Pull Request #3598 \u00b7 micrometer-met\u2026<\/div><\/div><div class=\"lkc-url\">https:\/\/github.com\/micrometer-metrics\/micrometer\/pull\/3598\/files#diff-490f2c5ae7960227c94a928ebfbd4be703cf78eff1a633a391c55e82558f6a7d<\/div><div class=\"lkc-excerpt\">Copied and adapted from the existing instrumentation for Apache HttpClient 4. This is a follow-up to gh-3009 that started the work. This needed to be redone to incorporate the Observation API suppo\u2026<\/div><\/div><div class=\"clear\"><\/div><\/div><\/a><\/div><\/div>\n\n\n\n<div class=\"wp-block-sgb-accordion sgb-acc\"><input id=\"toggle-checkbox-4ec18af3-aba4-462b-89e3-4eef4f6273fb\" class=\"sgb-acc__input\" type=\"checkbox\"><label class=\"sgb-acc__title\" for=\"toggle-checkbox-4ec18af3-aba4-462b-89e3-4eef4f6273fb\" style=\"color:#333;background-color:#FFF\">HttpCliet4\u7cfb\uff08SpringBoot2\u7cfb\uff09\u306e\u5b9f\u88c5\u65b9\u6cd5\u306f\u3053\u3061\u3089<\/label><div class=\"sgb-acc__content sgb-acc__content--save\">\n<div class=\"hcb_wrap\"><pre class=\"prism undefined-numbers lang-java\" data-lang=\"Java\"><code>    @Bean\n    public PoolingHttpClientConnectionManager connectionManager() {\n        return new PoolingHttpClientConnectionManager();\n    }\n\n    @Bean\n    public PoolingHttpClientConnectionManagerMetricsBinder connectionManagerMetricsBinder(\n            MeterRegistry meterRegistry,\n            PoolingHttpClientConnectionManager connectionManager\n    ) {\n        var binder = new PoolingHttpClientConnectionManagerMetricsBinder(connectionManager, \"http-client\");\n        binder.bindTo(meterRegistry);\n        \n        return binder;\n    }\n\n    @Bean\n    public RestTemplate myRestTemplate(PoolingHttpClientConnectionManager connectionManager) {\n        HttpClient httpClient = HttpClientBuilder.create()\n                .setConnectionManager(connectionManager)\n                .build();\n        HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory();\n        requestFactory.setHttpClient(httpClient);\n\n        return new RestTemplateBuilder()\n                .requestFactory(() -&gt; requestFactory)\n                .build();\n    }<\/code><\/pre><\/div>\n<\/div><\/div>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-5\">WebClient<\/h3>\n\n\n\n<p>WebClient\u3092\u5229\u7528\u3057\u3066\u3044\u308b\u5834\u5408\u306f\u3001WebClient\u306e\u751f\u6210\u6642\u306b\u30ab\u30b9\u30bf\u30de\u30a4\u30ba\u304c\u5fc5\u8981\u306b\u306a\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u307e\u305f\u300199%ile\u3092\u53d6\u5f97\u3059\u308b\u305f\u3081\u306b<code>application.yaml<\/code>\u3082\u5909\u66f4\u3057\u3066\u304a\u304f\u3068\u3088\u3044\u3067\u3059\uff01<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism undefined-numbers lang-java\" data-lang=\"Java\"><code>    @Bean\n    public WebClient myWebClient(ObservationWebClientCustomizer observationWebClientCustomizer) {\n        var connectionProvider = ConnectionProvider.builder(\"sample\")\n                .maxConnections(100) \/\/ \u30b3\u30cd\u30af\u30b7\u30e7\u30f3\u30d7\u30fc\u30eb\u6570\n                .metrics(true) \/\/ \u30b3\u30cd\u30af\u30b7\u30e7\u30f3\u6570\u306e\u30e1\u30c8\u30ea\u30af\u30b9\u3092\u6709\u52b9\u5316\n                .build();\n\n        var httpClient = HttpClient.create(connectionProvider);\n\n        return WebClient.builder()\n                .clientConnector(new ReactorClientHttpConnector(httpClient))\n                .apply(observationWebClientCustomizer::customize)  \/\/ http client\u306e\u30e1\u30c8\u30ea\u30af\u30b9\u3092\u53ce\u96c6\n                .build();\n    }<\/code><\/pre><\/div>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism undefined-numbers lang-yaml\" data-lang=\"Yaml\"><code>management:\n  metrics:\n    distribution:\n      percentiles:\n        # \u53d6\u5f97\u3059\u308b\u30d1\u30fc\u30bb\u30f3\u30bf\u30a4\u30eb\u306e\u8a2d\u5b9a\uff08\u3053\u306e\u4f8b\u3060\u306850%ile\u306899%ile\uff09\n        \"http.client.requests\": 0.5,0.99<\/code><\/pre><\/div>\n\n\n\n<p>\u898b\u308b\u3079\u304d\u30e1\u30c8\u30ea\u30af\u30b9\u306f\u3053\u3061\u3089\uff01<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>http_client_requests_seconds_count<\/code>\n<ul class=\"wp-block-list\">\n<li>\u7d2f\u7a4d\u306eHTTP\u30ea\u30af\u30a8\u30b9\u30c8\u6570\u3092\u8fd4\u3059\u30e1\u30c8\u30ea\u30af\u30b9\u3067\u3059<\/li>\n\n\n\n<li>Prometheus\u3067\u3044\u3046<code>irate<\/code>\u306e\u3088\u3046\u306a\u4e00\u5b9a\u671f\u9593\u306e\u5dee\u5206\u3092\u6c42\u3081\u308b\u95a2\u6570\u3068\u5408\u308f\u305b\u3066\u5229\u7528\u3059\u308b\u3053\u3068\u3067rps\u3092\u628a\u63e1\u3067\u304d\u307e\u3059<\/li>\n\n\n\n<li>\u307e\u305fHTTP\u30b9\u30c6\u30fc\u30bf\u30b9\u304c\u30bf\u30b0\u306b\u542b\u307e\u308c\u308b\u305f\u3081\u3001\u30a8\u30e9\u30fc\u4ef6\u6570\u3084\u30a8\u30e9\u30fc\u5272\u5408\u306a\u3093\u304b\u3082\u628a\u63e1\u3067\u304d\u307e\u3059<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><code>http_client_requests_seconds<\/code>\n<ul class=\"wp-block-list\">\n<li>\u30ec\u30b9\u30dd\u30f3\u30b9\u306e\u30d1\u30fc\u30bb\u30f3\u30bf\u30a4\u30eb\u3092\u8fd4\u3059\u30e1\u30c8\u30ea\u30af\u30b9\u3067\u3059<\/li>\n\n\n\n<li>\u5e73\u5747\u3060\u3068\u4e00\u90e8\u306e\u9045\u3044\u30ea\u30af\u30a8\u30b9\u30c8\u304c\u4e38\u3081\u8fbc\u307e\u308c\u3066\u3057\u307e\u3046\u305f\u3081<strong><span class=\"keiko_yellow\">99%ile\u7b49\u3067\u30ec\u30b9\u30dd\u30f3\u30b9\u3092\u628a\u63e1<\/span><\/strong>\u3059\u308b\u306e\u304c\u30aa\u30b9\u30b9\u30e1\u3067\u3059<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><code>reactor_netty_connection_provider_max_connections<\/code>\n<ul class=\"wp-block-list\">\n<li>HTTP\u30b3\u30cd\u30af\u30b7\u30e7\u30f3\u306e\u6700\u5927\u5024\u3092\u8fd4\u3059\u30e1\u30c8\u30ea\u30af\u30b9\u3067\u3059<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><code>reactor_netty_connection_provider_active_connections<\/code> \/ <code>reactor_netty_connection_provider_total_connections<\/code>\n<ul class=\"wp-block-list\">\n<li>\u5229\u7528\u4e2d\u306e\u30b3\u30cd\u30af\u30b7\u30e7\u30f3\u6570\u3092\u8fd4\u3059\u30e1\u30c8\u30ea\u30af\u30b9\u3067\u3059<\/li>\n\n\n\n<li>active\u3068total\u3067\u3069\u3061\u3089\u304c\u3044\u3044\u304b\u307e\u3067\u8ffd\u3048\u3066\u304a\u3089\u305a\uff12\u3064\u8f09\u305b\u3066\u3044\u307e\u3059<\/li>\n\n\n\n<li>active\u306e\u65b9\u3060\u3068\u30d4\u30f3\u30dd\u30a4\u30f3\u30c8\u306b\u5229\u7528\u4e2d\u306e\u30b3\u30cd\u30af\u30b7\u30e7\u30f3\u304c\u591a\u3044\u3068\u304d\u306b\u30e1\u30c8\u30ea\u30af\u30b9\u53ce\u96c6\u3057\u306a\u3044\u3068\u6b63\u78ba\u306b\u72b6\u6cc1\u304c\u628a\u63e1\u3067\u304d\u306a\u3044\u306e\u3067\u306f\uff1f\u3068\u60f3\u5b9a\u306f\u3057\u3066\u3044\u307e\u3059\u3002<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-6\">\u756a\u5916\u7de8<\/h2>\n\n\n\n<p>SpringBoot\u3084Micromerter\u3067\u30b5\u30dd\u30fc\u30c8\u3055\u308c\u3066\u3044\u306a\u3044\u30ea\u30bd\u30fc\u30b9\u3067\u3082\u3001<br>\u30a2\u30ce\u30c6\u30fc\u30b7\u30e7\u30f3\u3092\u4ed8\u4e0e\u3059\u308b\u3060\u3051\u3067\u30e1\u30bd\u30c3\u30c9\u5358\u4f4d\u306e\u30e1\u30c8\u30ea\u30af\u30b9\u3092\u7c21\u5358\u306b\u53ce\u96c6\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\uff01<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism undefined-numbers lang-plain\"><code>dependencies {\n    ...\n    \/\/ spring-boot-starter-aop\u3092\u4f9d\u5b58\u306b\u8ffd\u52a0\u3059\u308b\n    implementation 'org.springframework.boot:spring-boot-starter-aop'\n    ...\n}<\/code><\/pre><\/div>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism undefined-numbers lang-java\" data-lang=\"Java\"><code>@Configuration\npublic class MetricsAutoConfiguration {\n     \/\/ @Timed\u3092\u5229\u7528\u3059\u308b\u5834\u5408\u306bBean\u767b\u9332\u304c\u5fc5\u8981\n    @Bean\n    public TimedAspect timedAspect(MeterRegistry registry) {\n        return new TimedAspect(registry);\n    }\n\n    \/\/ \/\/ @Counted\u3092\u5229\u7528\u3059\u308b\u5834\u5408\u306bBean\u767b\u9332\u304c\u5fc5\u8981\n    @Bean\n    public CountedAspect countedAspect(MeterRegistry registry) {\n        return new CountedAspect(registry);\n    }\n}<\/code><\/pre><\/div>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism undefined-numbers lang-java\" data-lang=\"Java\"><code>    @Timed(\n            \/\/ \u30e1\u30c8\u30ea\u30af\u30b9\u540d\n            value = \"timed.metrics\",\n            \/\/ \u30d1\u30fc\u30bb\u30f3\u30bf\u30a4\u30eb\u3092\u8a08\u6e2c\u3057\u305f\u3044\u5834\u5408\u306b\u6307\u5b9a\uff08\u4f8b\u3067\u306f50%ile\u306899%ile\u3092\u6307\u5b9a\uff09\n            percentiles = {0.5, 0.99}\n    )\n    public String timedMethod() {\n    }\n\n    @Counted(\n            \/\/ \u30e1\u30c8\u30ea\u30af\u30b9\u540d\n            value = \"counted.metrics\"\n    )\n    public String counted() {\n    }<\/code><\/pre><\/div>\n","protected":false},"excerpt":{"rendered":"<p>SpringBoot\u3067\u5b9f\u88c5\u3057\u305f\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3067\u300c\u30e1\u30c8\u30ea\u30af\u30b9\u3067\u76e3\u8996\u3057\u3088\u3046\uff01\u300d\u3068\u306f\u601d\u3063\u305f\u3082\u306e\u306e\u3001\u300c\u4f55\u3092\u898b\u305f\u3089\u3044\u3044\u3093\u3060\u2026\u300d\u3068\u306a\u3063\u3066\u3044\u306a\u3044\u3067\u3057\u3087\u3046\u304b\uff1f \u50d5\u3082\u4ee5\u524d\u306f\u540c\u3058\u72b6\u6cc1\u3060\u3063\u305f\u306e\u3067\u3059\u304c\u3001\uff13\u5e74\u307b\u3069\u304b\u3051\u3066\u30e1\u30c8\u30ea\u30af\u30b9\u76e3\u8996\u3067\u306e\u904b\u7528\u3092\u7d9a &#8230; <\/p>\n","protected":false},"author":1,"featured_media":280,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[6],"tags":[55,13,53],"class_list":{"0":"post-271","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","7":"category-6","8":"tag-mictometer","9":"tag-springboot","10":"tag-53"},"jetpack_featured_media_url":"https:\/\/hirabay.net\/wp-content\/uploads\/2023\/01\/da7c604feeaedb7514ca1b6327a468eb.png","_links":{"self":[{"href":"https:\/\/hirabay.net\/index.php?rest_route=\/wp\/v2\/posts\/271","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/hirabay.net\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/hirabay.net\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/hirabay.net\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/hirabay.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=271"}],"version-history":[{"count":7,"href":"https:\/\/hirabay.net\/index.php?rest_route=\/wp\/v2\/posts\/271\/revisions"}],"predecessor-version":[{"id":566,"href":"https:\/\/hirabay.net\/index.php?rest_route=\/wp\/v2\/posts\/271\/revisions\/566"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/hirabay.net\/index.php?rest_route=\/wp\/v2\/media\/280"}],"wp:attachment":[{"href":"https:\/\/hirabay.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=271"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/hirabay.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=271"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/hirabay.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=271"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}