Closed brandon-wonjune closed 6 years ago
@kyungtaak 해당 상세페이지에서 사용되는 api에 대한 문의사항입니다. 기존에 타입 변경에 사용되던 api를 사용하여 테스트하였습니다.
api/datasources/{soruceId}/fields
필터링 설정과 제거에는 filtering = true | false
로 하였더니 정상적으로 작동을 하였으나,
필터링 옵션에 대해서는 아래와 같은 오류가 발생합니다.
// params
[{
aggrType:"NONE"
alias:"PLUGIN_NAME"
biType:"DIMENSION"
filtering:true
filteringOptions:{allowSelectors: ["SINGLE_LIST"], type: "INCLUSION", defaultSelector: "SINGLE_LIST"}
filteringSeq:0
id:10037124
logicalType:"STRING"
name:"PLUGIN_NAME"
op:"replace"
role:"DIMENSION"
seq:0
type:"STRING"
}]
// error
com.metatron.discovery.common.exception.UnknownServerException: java.util.LinkedHashMap cannot be cast to java.lang.String
at com.metatron.discovery.common.exception.GlobalExceptionHandler.handleAll(GlobalExceptionHandler.java:133)
at sun.reflect.GeneratedMethodAccessor661.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:133)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:97)
at org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver.doResolveHandlerMethodException(ExceptionHandlerExceptionResolver.java:384)
at org.springframework.web.servlet.handler.AbstractHandlerMethodExceptionResolver.doResolveException(AbstractHandlerMethodExceptionResolver.java:59)
at org.springframework.web.servlet.handler.AbstractHandlerExceptionResolver.resolveException(AbstractHandlerExceptionResolver.java:136)
at org.springframework.web.servlet.handler.HandlerExceptionResolverComposite.resolveException(HandlerExceptionResolverComposite.java:76)
at org.springframework.web.servlet.DispatcherServlet.processHandlerException(DispatcherServlet.java:1222)
at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1034)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:984)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:901)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:843)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.springframework.boot.web.filter.ApplicationContextHeaderFilter.doFilterInternal(ApplicationContextHeaderFilter.java:55)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.springframework.boot.actuate.trace.WebRequestTraceFilter.doFilterInternal(WebRequestTraceFilter.java:110)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at com.metatron.discovery.common.web.CommonLocalVariableFilter.doFilter(CommonLocalVariableFilter.java:45)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at com.metatron.discovery.common.web.LogbackMdcFilter.doFilter(LogbackMdcFilter.java:39)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:317)
at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:127)
at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:91)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:114)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:137)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:111)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:170)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
at org.springframework.security.oauth2.provider.authentication.OAuth2AuthenticationProcessingFilter.doFilter(OAuth2AuthenticationProcessingFilter.java:176)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:116)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
at org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:96)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:64)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:105)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:56)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:214)
at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:177)
at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:347)
at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:263)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.springframework.session.web.http.SessionRepositoryFilter.doFilterInternal(SessionRepositoryFilter.java:167)
at org.springframework.session.web.http.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:80)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:197)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.springframework.boot.actuate.autoconfigure.MetricsFilter.doFilterInternal(MetricsFilter.java:106)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:478)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:803)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1459)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to java.lang.String
at com.metatron.discovery.domain.datasource.Field.updateField(Field.java:229)
at com.metatron.discovery.domain.datasource.DataSourceController.patchFieldsInDataSource(DataSourceController.java:501)
at com.metatron.discovery.domain.datasource.DataSourceController$$FastClassBySpringCGLIB$$c7954abd.invoke(<generated>)
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:669)
at com.metatron.discovery.domain.datasource.DataSourceController$$EnhancerBySpringCGLIB$$bbedd86e.patchFieldsInDataSource(<generated>)
at sun.reflect.GeneratedMethodAccessor645.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:133)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:97)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:827)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:738)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:967)
... 86 more
@brandon-exntu 네 수정해놓겠습니다. f#9-add_filter_config 브렌치 활용 부탁드립니다.
@brandon-exntu 수정하였습니다. 일부 스펙변경이 있었습니다. (@eltriny 대시보드 구성시 영향도가 있다면 함께 변경 부탁드립니다.)
[{
...,
"filteringOptions": {
"type": "TIME", // 기존 INTERVAL -> TIME 으로 변경
"defaultSelector": "range",
"allowSelectors": [
"range",
"relative"
]
}
},
{
...,
"filteringOptions": {
"type": "INCLUSION",
"defaultSelector": "single_list",
"allowSelectors": [
"single_list",
"single_combo"
]
}
}]
@kyungtaak 확인하였습니다. 테스트한 결과 필터링 옵션은 추가가 되나 제거가 되지 않습니다. 추가된 필터링옵션에서 제거에 대한 파라메터는 아래와 같이 보냈습니다.
alias:"City"
filtering:true
filteringSeq:1
id:10037002
logicalType:"STRING"
name:"City"
op:"replace"
role:"DIMENSION"
seq:2
type:"STRING"
에러는 발생하지 않으나 필터링옵션 제거가 되지 않습니다. 아래는 변경을 요청한 컬럼에대한 조회 결과입니다.
alias:"City"
filtering:true
filteringOptions:{type: "INCLUSION", defaultSelector: "SINGLE_LIST", allowSelectors: ["SINGLE_LIST"]}
filteringSeq:1
id:10037002
logicalType:"STRING"
name:"City"
role:"DIMENSION"
seq:2
type:"STRING"
filteringOption 을 제거한다는것은 필터 설정을 하지 않겠다는 것으로 인식하였습니다. 따라서 filtering 속성을 false 로 주게 되면 filtering 관련 추가 속성들이 모두 null 처리가 되도록 수정하였으니, 추가/제거시 filtering 속성을 기준으로 작업해주세요.
@kyungtaak 기획 쪽에서 전달 받은 내용입니다. 요청사항에 의해 filteringOption을 설정하는 체크박스를 hide 시켜놓겠습니다.
해당 체크박스는 필수필터를 대시보드에서 사용할 때 필터링 선택 범위를 제한할 수 있는 옵션입니다. 대시보드 필터링 설정 화면에서 리스트 타입일 경우, 체크를 하면 ‘다중’ 선택이 비활성 됩니다. 시간 타입일 경우, 체크를 하면 ‘전체기간’이 비활성 됩니다. 그런데, 지금 싱글 선택일때도 (All) 이 목록으로 추가되어 선택 범위를 제한 하는 것이 의미가 없어졌고, 시간 필터의 UI에 대한 이슈도 있기 때문에 기획 재검토가 필요해 보입니다. 관련 이슈가 처리될 때까지 기능을 잠시 막아주시는 것이 좋을 것 같습니다
@metatron-app/design linked datasource 관련 고려 부탁드립니다.
@AnnieHwang 링크드일때 컬럼 디테일 탭에 Statistics, Histogram, Value list, Convariance ranking 을 막아주면 될까요? 참고로, 수집형 일때 기획서 첨부합니다.
@minjung-cho 다른건 다 막아주는게 맞을것 같고요. Value list는 혹시 Histogram하단에 나오는 value와 covariance값을 말씀하시는건가요? 진짜 Value list를 말씀하시는건가요? @kyungtaak 저는 링크드 일때도 실제 Value List가 나와야 할 것 같은데 (에센셜필터 등을 할때 사용하려고요) 혹시 개발이 가능할까요?
@AnnieHwang value list는 차원값>시간이외 의 Statistics 하단의 value count 값들이요~
@AnnieHwang @minjung-cho JDBC 상에서 사실 Druid 내에서 와 같이 value list 를 포함하여 통계정보를 내는것은 비용이 큽니다. 따라서 두가지 안을 제안드리고 싶은데요. 전 1안으로 심플(?) 하게 갔으면 하는데요. 검토해주세요.
@kyungtaak 1번으로 '통계 정보 제거'로 형태로 나오는걸로 결정하였습니다. 감사합니다.
@brandon-wonjune 링크드 타입인 경우, Statistics, Histogram, Value list, Convariance ranking 은 안보이면 됩니다. 또한, Monitoring 탭도 안보여야 합니다.(#155)
기획서 V.1.30에 반영함
@minjung-cho Linked 타입인경우 Statistics, Histogram, Value list, Convariance ranking를 숨기도록 처리하였습니다. 모니터링 탭의 경우 #155 에서 처리하였습니다. https://tde.sktelecom.com/pms/browse/METATRON-1417 도 또한 같이 처리하였습니다.
@brandon-wonjune 수정 완료후 소스코드에 충돌 이슈가 있다면, #155 이슈와 묶어서 PR 이슈로 올려주세요.
@kyungtaak 문의사항이 있습니다. 저번에 브랜치를 날렸을때 파일을 백업한것을 다시 커밋했는데 Field.java 파일에서
public BIType getBiType() {
if(role == null) {
return null;
}
return BIType.valueOf(role.name());
}
이 부분에 @JsonIgnore
와 @Deprecated
에 추가되는게 맞나요?
만약 추가되는게 맞다면 차트쪽에서 문제가 생길 수 있습니다.
@brandon-wonjune 현재 BIType 은 1.0 에서 사용하던 필드로 Deprecated 시키고 이는 "role" 이라는 속성으로 변경될 예정입니다. @eltriny @dave-taeho 아직도 BiType을 쓰는 곳이 있나요? 확인해주시고요. 아직 사용한다면 임시로 @JsonIgore 어노테이션을 추가해서 올려주세요.
@kyungtaak 해당 작업을 마무리 했는데 현재 로컬에서 테스트 중 입니다. 그런데 연결형 데이터소스를 이용한 적재가 되지 않고 있습니다. 그로인해 필수필터에 대한 확인은 로컬에서 하지 못하는 상태입니다. 혹시 확인할 수 있는 다른 방법이 있을까요?
@brandon-wonjune 우선 PR 오픈 해주시고 testbed에서 확인 하는게 좋을것 같습니다.
Is your feature request related to a problem? Please describe.
Describe the solution you'd like
Describe alternatives you've considered
Additional context