Проверки качества данных внешних систем¶
В этой статье:
Совет
Описание получения результатов проверок см. по ссылке
Сохранение результатов качества данных¶
POST-запрос /v1/dg/dq-checks/results/save
Пример запроса:
{ "checkEtalonId": "987e0ae2-c168-11ed-a41c-23a5c36cad53", "checkTypeName": "dq_check_formit", "executionDate": "2023-03-02T13:00:30+03:00", "rowCount": 100, "rowException": 15, "score": 85 }
В случае успешного сохранения результата проверки качества данных возвращается пустой ответ со статусом 200.
Успешное сохранение результата качества данных возможно только в случае если выполнены все следующие условия:
В системе существует актив проверки качества с типом
checkTypeName
(из тела запроса) и эталонным ключомcheckEtalonId
(из тела запроса);Существует хотя бы одна входящая связь типа has_dq_check к активу проверки качества от актива правила качества (типа "Правило качества" (dq_rule);
Существует хотя бы одна исходящая связь типа dq_check_link от актива проверки качества к активу проверяемого объекта.
В случае ошибки возвращается ответ со статусом 500.
Пример ответа со статусом 500:
{ "details": { "info": [], "warning": [], "error": [ { "domain": "DG_QUALITY_CHECK_RUNTIME_EXCEPTION", "source": null, "code": "EX_QUALITY_CHECK_NOT_FOUND", "severity": "ERROR", "externalMessage": "Актив проверки качества (type name: [dq_check_formit], etalon id: [987e0ae2-c168-11ed-a41c-23a5c36cad51]) не найден", "internalMessage": "QualityCheckRuntimeException: Quality check (type name: [dq_check_formit], etalon id: [987e0ae2-c168-11ed-a41c-23a5c36cad51]) is not found.", "details": "com.universe.dg.dq.checks.exception.QualityCheckRuntimeException: [EX_QUALITY_CHECK_NOT_FOUND] Quality check (type name: [dq_check_formit], etalon id: [987e0ae2-c168-11ed-a41c-23a5c36cad51]) is not found.\r\n\tat com.universe.dg.dq.checks.service.impl.QualityChecksServiceImpl.save(QualityChecksServiceImpl.java:154)\r\n\tat com.universe.dg.rest.v1.dq.checks.service.DataGovernanceQualityChecksRestService.saveCheckResult(DataGovernanceQualityChecksRestService.java:143)\r\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\r\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)\r\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\r\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:566)\r\n\tat org.apache.cxf.service.invoker.AbstractInvoker.performInvocation(AbstractInvoker.java:179)\r\n\tat org.apache.cxf.service.invoker.AbstractInvoker.invoke(AbstractInvoker.java:96)\r\n\tat org.apache.cxf.jaxrs.JAXRSInvoker.invoke(JAXRSInvoker.java:201)\r\n\tat org.apache.cxf.jaxrs.JAXRSInvoker.invoke(JAXRSInvoker.java:104)\r\n\tat org.apache.cxf.interceptor.ServiceInvokerInterceptor$1.run(ServiceInvokerInterceptor.java:59)\r\n\tat org.apache.cxf.interceptor.ServiceInvokerInterceptor.handleMessage(ServiceInvokerInterceptor.java:96)\r\n\tat org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:307)\r\n\tat org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:121)\r\n\tat org.apache.cxf.transport.http.AbstractHTTPDestination.invoke(AbstractHTTPDestination.java:265)\r\n\tat org.apache.cxf.transport.servlet.ServletController.invokeDestination(ServletController.java:234)\r\n\tat org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:208)\r\n\tat org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:160)\r\n\tat org.apache.cxf.transport.servlet.CXFNonSpringServlet.invoke(CXFNonSpringServlet.java:225)\r\n\tat org.apache.cxf.transport.servlet.AbstractHTTPServlet.handleRequest(AbstractHTTPServlet.java:304)\r\n\tat org.apache.cxf.transport.servlet.AbstractHTTPServlet.doPost(AbstractHTTPServlet.java:217)\r\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:681)\r\n\tat org.apache.cxf.transport.servlet.AbstractHTTPServlet.service(AbstractHTTPServlet.java:279)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\r\n\tat org.apache.catalina.filters.CorsFilter.handleNonCORS(CorsFilter.java:357)\r\n\tat org.apache.catalina.filters.CorsFilter.doFilter(CorsFilter.java:176)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\r\n\tat org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\r\n\tat org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:197)\r\n\tat org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97)\r\n\tat org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541)\r\n\tat org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:135)\r\n\tat org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)\r\n\tat org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:687)\r\n\tat org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78)\r\n\tat org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:360)\r\n\tat org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:399)\r\n\tat org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)\r\n\tat org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:890)\r\n\tat org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1743)\r\n\tat org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)\r\n\tat org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)\r\n\tat org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)\r\n\tat org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)\r\n\tat java.base/java.lang.Thread.run(Thread.java:834)\r\n", "params": [] } ] }, "errorMessage": "Quality check (type name: [dq_check_formit], etalon id: [987e0ae2-c168-11ed-a41c-23a5c36cad51]) is not found." }
Получение активов проверок качества¶
POST-запрос /v1/dg/dq-checks/checks
Пример запроса:
{ "typeName": "dq_check_formit", "page": 0, "count": 10 }
В случае успеха возвращается ответ со статусом 200 (помимо полей checkEtalonId
и executionDate
возвращаются все простые заполненные атрибуты актива проверки качества).
Пример ответа:
{ "totalCount": 2, "typeName": "dq_check_formit", "dqChecks": [ { "score_quality_low": 10, "status": "S-3", "technical_rule": "rule_1", "executionDate": "2023-03-02T22:00:30+03:00", "RuleType": "RT-2", "id": "id_1", "score_quality_high": 80, "checkEtalonId": "987e0ae2-c168-11ed-a41c-23a5c36cad53" }, { "executionDate": "2023-03-02T11:00:30+03:00", "id": "ssss", "checkEtalonId": "860c2845-c310-11ed-8836-23a5c36cad53", "technical_rule": "aaa" } ] }
В случае ошибки (указан несуществующий тип актива) возвращается ответ со статусом 500.
Пример ответа со статусом 500:
{ "details": { "info": [], "warning": [], "error": [ { "domain": null, "source": null, "code": "FOREIGN_EXCEPTION", "severity": "CRITICAL", "externalMessage": null, "internalMessage": "NullPointerException: Asset type with name [dq_check_formit1] was not found in DG model", "details": "java.lang.NullPointerException: Asset type with name [dq_check_formit1] was not found in DG model\r\n\tat java.base/java.util.Objects.requireNonNull(Objects.java:246)\r\n\tat com.universe.dg.dq.checks.service.impl.QualityChecksServiceImpl.loadQualityChecks(QualityChecksServiceImpl.java:269)\r\n\tat com.universe.dg.rest.v1.dq.checks.service.DataGovernanceQualityChecksRestService.getQualityChecks(DataGovernanceQualityChecksRestService.java:112)\r\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\r\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)\r\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\r\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:566)\r\n\tat org.apache.cxf.service.invoker.AbstractInvoker.performInvocation(AbstractInvoker.java:179)\r\n\tat org.apache.cxf.service.invoker.AbstractInvoker.invoke(AbstractInvoker.java:96)\r\n\tat org.apache.cxf.jaxrs.JAXRSInvoker.invoke(JAXRSInvoker.java:201)\r\n\tat org.apache.cxf.jaxrs.JAXRSInvoker.invoke(JAXRSInvoker.java:104)\r\n\tat org.apache.cxf.interceptor.ServiceInvokerInterceptor$1.run(ServiceInvokerInterceptor.java:59)\r\n\tat org.apache.cxf.interceptor.ServiceInvokerInterceptor.handleMessage(ServiceInvokerInterceptor.java:96)\r\n\tat org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:307)\r\n\tat org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:121)\r\n\tat org.apache.cxf.transport.http.AbstractHTTPDestination.invoke(AbstractHTTPDestination.java:265)\r\n\tat org.apache.cxf.transport.servlet.ServletController.invokeDestination(ServletController.java:234)\r\n\tat org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:208)\r\n\tat org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:160)\r\n\tat org.apache.cxf.transport.servlet.CXFNonSpringServlet.invoke(CXFNonSpringServlet.java:225)\r\n\tat org.apache.cxf.transport.servlet.AbstractHTTPServlet.handleRequest(AbstractHTTPServlet.java:304)\r\n\tat org.apache.cxf.transport.servlet.AbstractHTTPServlet.doPost(AbstractHTTPServlet.java:217)\r\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:681)\r\n\tat org.apache.cxf.transport.servlet.AbstractHTTPServlet.service(AbstractHTTPServlet.java:279)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\r\n\tat org.apache.catalina.filters.CorsFilter.handleNonCORS(CorsFilter.java:357)\r\n\tat org.apache.catalina.filters.CorsFilter.doFilter(CorsFilter.java:176)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\r\n\tat org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\r\n\tat org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:197)\r\n\tat org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97)\r\n\tat org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541)\r\n\tat org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:135)\r\n\tat org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)\r\n\tat org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:687)\r\n\tat org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78)\r\n\tat org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:360)\r\n\tat org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:399)\r\n\tat org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)\r\n\tat org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:890)\r\n\tat org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1743)\r\n\tat org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)\r\n\tat org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)\r\n\tat org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)\r\n\tat org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)\r\n\tat java.base/java.lang.Thread.run(Thread.java:834)\r\n", "params": [] } ] }, "errorMessage": "Asset type with name [dq_check_formit1] was not found in DG model" }