web-dev-qa-db-ja.com

SpringCloudでHystrixダッシュボードのコマンドメトリックストリームに接続できません

親からのスニペットであるSpringCloudを使用したマイクロサービスプロジェクトがあります。

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.7.RELEASE</version>
</parent>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>Dalston.SR3</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>

すべてのサービスはEurekaサーバーで実行されています。

enter image description here

すべてのサービスは正常に実行されています。私はPostmanで適切な電話をかけることができ、すべてが正常に機能します。

pomからのスニペットであるHystrixダッシュボードを処理する別のサービスがあります。

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <exclusions>
            <exclusion>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-Tomcat</artifactId>
            </exclusion>
        </exclusions>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-jetty</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-hystrix-dashboard</artifactId>
    </dependency>

構成メインクラス:

@SpringBootApplication
@EnableHystrixDashboard
public class DashboardApp {
    public static void main(String[] args) {
        SpringApplication.run(DashboardApp.class, args);
    }
}

およびconfigyamlファイル:

spring:
  application:
    name: Dashboard

server:
  port: 8000

eureka:
  client:
    fetchRegistry: true
    registerWithEureka: false
    serviceUrl:
      defaultZone: http://localhost:8761/eureka

次のダッシュボードを探しています:

enter image description here

コンソールからの完全なスタックトレースは ここ です。以下はいくつかのスニペットです:

2018-04-12 11:28:25.089 ERROR 15762 --- [qtp295055909-16] ashboardConfiguration$ProxyStreamServlet : Error proxying request: http://localhost:8082/hystrix.stream
Java.lang.RuntimeException: org.Eclipse.jetty.io.EofException
    at org.springframework.cloud.netflix.hystrix.dashboard.HystrixDashboardConfiguration$ProxyStreamServlet.doGet(HystrixDashboardConfiguration.Java:208)
....
Caused by: org.Eclipse.jetty.io.EofException: null
...
Caused by: Java.io.IOException: Broken pipe
...

サービス自体は、スプリングアクチュエータでアクセスできます。

enter image description here

pomからの抜粋:

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-eureka</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-hystrix</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>

構成クラスの外観:

@EnableHystrix
@EnableEurekaClient
@SpringBootApplication
public class TableApp {
    public static void main(String[] args) {
        SpringApplication.run(TableApp.class, args);
    }
}

この問題を解決する方法は?

5
nazar_art

最後に、私は解決策を見つけました。

問題は、Controller APIを HystrixCommand アノテーションで販売する必要があることでした。

ドキュメントからの抜粋:

Turbine AMQP by Spring Cloud offers a different model where each
application instance pushes the metrics from Hystrix commands to
Turbine through a central AMQP broker.

次のように、すべてのコントローラーのメソッドにパラメーターなしで追加しました。

@RestController
@AllArgsConstructor
public class GuestController {
    private DinnerService dinnerService;

    @HystrixCommand
    @PostMapping("/dinner")
    public Integer startDinner(@RequestBody List<Integer> menuItems) {
        return dinnerService.startDinner(menuItems);
    }

    @HystrixCommand
    @DeleteMapping("/dinner/{tableId}")
    public void finishDinner(@PathVariable Integer tableId) {
        dinnerService.finishDinner(tableId);
    }
}

そして今、すべてが魅力的なように機能します:

enter image description here

今、私はそれにとても近かったことを理解しています。

1
nazar_art

Spring Boot 2を使用している場合は、hystrix.streamエンドポイントが/actuator/hystrix.streamに移動されました。

私にとってこのURLは機能しました:

http://localhost:8082/actuator/hystrix.stream

はい、次のプロパティを使用してこのアクチュエータエンドポイントを有効にします。

management.endpoints.web.exposure.include=hystrix.stream

もちろん、プロジェクトにアクチュエータの依存関係が含まれている必要があります。

10
Shanu Gupta

Hystrixダッシュボード自体を使用して、一度に複数のインスタンスを監視することはできません。必要なのは タービン +ダッシュボードです。一言で言えば、タービンはいくつかのhystrixメトリックストリームのアグリゲーターです。

インスタンスの構成:

management:
  endpoints:
    web:
      exposure:
        include: hystrix.stream, info, health

spring:
  application:
    name: WRITING
eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka

ここで重要なことは、hystix.streamアクチュエーターを公開することです。このエンドポイントは、タービンがメトリックを読み取るために使用されます。また、アクチュエータスターターを追加することを忘れないでください。

   <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
   </dependency>

すべてを正しく行った場合http://localhost:8080/actuator/hystrix.streamエンドポイントが利用可能になるはずです。

タービン構成は次のようになります。

server:
      port: 8888

spring:
  application:
    name: TURBINE

eureka:
  client:
    registerWithEureka: true
    fetchRegistry: true
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/

turbine:
  appConfig: WRITING,READING
  clusterNameExpression: new String('default')

appConfigで、監視するサービス名を指定する必要があります。

タービン始動後localhost:8888/turbine.stream 使えるようになる。

このURLをダッシュ​​ボードに渡して、検出されたインスタンスのhystrixコマンドについて集約されたすべてのデータを監視できます。

Github プロジェクトの例。

p.s.使用した依存関係は非推奨になりました。確認してください maven repo

4
Ivan Lymar

spring-boot-starter-parentに以下の2つのプロパティを追加することで、2.0.7.RELEASEバージョンspring-cloud-dependenciesおよびFinchley.SR2バージョンapplication.propertiesのこの問題を解決することができました。

management.endpoints.web.exposure.include=*
management.endpoints.web.base-path=/

enter image description here

4
Jeff Cook