복붙노트

[SPRING] Hystrix 대시 보드 용 명령 메트릭 스트림에 연결할 수 없습니다.

SPRING

Hystrix 대시 보드 용 명령 메트릭 스트림에 연결할 수 없습니다.

나는 스프링 클라우드 (Spring Cloud)라는 마이크로 서비스 프로젝트를 가지고 있는데, 부모로부터의 스 니펫이다 :

<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 서버에서 모든 서비스가 실행 중입니다.

모든 서비스가 잘 돌아갑니다. 우편 배달부와 전화를 걸면 모든 것이 잘됩니다.

나는 Hystrix 대시 보드를 처리하는 별도의 서비스를 가지고 있는데, 이는 pom의 스 니펫이다.

<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);
    }
}

및 구성 yaml 파일 :

spring:
  application:
    name: Dashboard

server:
  port: 8000

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

다음 대시 보드를 찾고 있습니다.

콘솔에서 전체 스택 추적을 볼 수 있습니다. 다음은 일부 스 니펫입니다.

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
...

스프링 액추에이터로 서비스 자체에 접근 가능 :

그것의 조각에서 발췌 :

    <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);
    }
}

이 문제를 해결하는 방법?

해결법

  1. ==============================

    1.스프링 부트 2를 사용하는 사람들은 hystrix.stream 엔드 포인트가 /actuator/hystrix.stream으로 이동되었습니다.

    스프링 부트 2를 사용하는 사람들은 hystrix.stream 엔드 포인트가 /actuator/hystrix.stream으로 이동되었습니다.

    나를 위해이 URL은 작동했습니다.

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

    그리고 예,이 액츄에이터 끝점을 다음 속성을 통해 활성화하십시오 :

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

    물론 액추에이터 종속성을 프로젝트에 포함시켜야합니다.

  2. ==============================

    2.Hystrix 대시 보드 자체는 여러 인스턴스를 한 번에 모니터링하는 데 사용할 수 없습니다. 당신이 필요로하는 것은 터빈 + 계기판입니다. 몇 가지 단어에서 터빈은 여러 hystrix 메트릭 스트림에 대한 집합 자입니다.

    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 endpoint가 이용 가능해야한다.

    터빈 설정은 다음과 같습니다.

    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에서 모니터링 할 서비스 이름을 지정해야합니다.

    터빈 로컬 호스트 시작 후 : 8888 / turbine.stream을 사용할 수 있습니다.

    이 URL을 대시 보드에 전달하고 발견 된 인스턴스의 hystrix 명령에 대해 집계 된 모든 데이터를 모니터 할 수 있습니다.

    Github 프로젝트 예제.

    추신. 사용한 종속성은 사용되지 않습니다. 메이븐 레포를 확인하십시오.

  3. ==============================

    3.마지막으로 해결책을 찾았습니다.

    마지막으로 해결책을 찾았습니다.

    문제는 컨트롤러 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.
    

    다음과 같이 모든 Controller의 메소드에 매개 변수없이 추가했습니다.

    @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);
        }
    }
    

    그리고 지금은 모두 매력적입니다.

    이제 나는 내가 그와 아주 가깝다는 것을 이해한다.

  4. ==============================

    4.Spring-boot-startter-parent 버전 2.0.7.RELEASE 및 spring-cloud-dependencies 버전 Finchley.SR2에 대해이 문제를 해결할 수있었습니다. 아래의 두 속성을 application.properties에 추가합니다.

    Spring-boot-startter-parent 버전 2.0.7.RELEASE 및 spring-cloud-dependencies 버전 Finchley.SR2에 대해이 문제를 해결할 수있었습니다. 아래의 두 속성을 application.properties에 추가합니다.

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

  5. from https://stackoverflow.com/questions/49792290/unable-to-connect-to-command-metric-stream-for-hystrix-dashboard-with-spring-clo by cc-by-sa and MIT license