An easy-to-use, cross-platform measurement tool that pulls data out of CD pipelines and analysis the four key metrics for you.

Overview

All Contributors Issues Licnece

Backend test Frontend test Publish release Docker image

Release

Maintained by SEA team, ThoughtWorks Inc.

Read this in other languages: English, 简体中文

Table of Contents

About the Project

For development teams who wants to measure their software delivery and operational (SDO) performance, this is a tool that helps them collect data from CD pipelines and visualize the key metrics in a friendly format.

The key differentiators:

  • One page configuration, quick and easy.
  • The ability to work across different CD platforms.
  • User can select the environment in which the analysis runs via a environment filter (Yes, production env is not the only one that matters)

Don't know what are those four key metrics?

Integration roadmap

List of CD tools the product supports now/plan to support

  • Jenkins

  • Bamboo

  • Github Actions

  • CircleCI

    ...and more on the way

Usage

Follow the two steps below to run the tool, and measure the four key metrics of your projects.

Install and run

The product is released to an ECR Docker repository public.ecr.aws/j2s5d3z8/4-key-metrics. Please follow the steps:

  1. Ensure Docker has already installed on your OS.
  2. Find available release versions in the release page.
    Or, you can find all history versions from our image repository
  3. Run the container locally via the following command:
docker run -d -p 80:80 --name metrik public.ecr.aws/j2s5d3z8/4-key-metrics:${release_version}

⚠️ We use port 80 to access the app. You may switch to any other port in case port 80 is occupied by other apps running on your machine.
⚠️ The latest tag matches the most recent version of this repository. Thus using public.ecr.aws/j2s5d3z8/4-key-metrics:latest or public.ecr.aws/j2s5d3z8/4-key-metrics will ensure you are running the most up to date version of this image.
If you want to stick to a specific version tag, remember there no "v" in version name. e.g. public.ecr.aws/j2s5d3z8/4-key-metrics:1.1.10

Configure your projects

After the container is running on your machine. Go to your favourite browser and open the app. If running in local that would be http://localhost:80/.

  1. Start the configuration:
  1. And the charts for each key metric will be available at the main page:
  1. Also the full screen view if you want to put it on big screens:

Advanced usage

If you would like to keep the 4-key-metrics data to avoid losing any data when remove container, you can mount the database folder /data/db out. And logs are also available if you mount the log folder /app/logs. As shown in the example below:

docker run -d -p 80:80 --name metrik -v "/path/to/local/directory:/data/db" -v "/path/to/another/directory:/app/logs" public.ecr.aws/j2s5d3z8/4-key-metrics:${release_version}

How to Compute, FAQs

See our Wiki page

Contributing

Contributions are what make the open source community such an amazing place to be learn, inspire, and create. Any contributions you make are greatly appreciated.

Please check our contributing guideline form HERE

Getting Started

The codebase comprises of three major components frontend, backend, ci.

  • Frontend app is a web application built with:

    • TypeScript
    • ReactJS
    • ReCharts

    Go to frontend folder to find more details.

  • Backend app is built with:

    • Kotlin
    • Spring Boot Web
    • MongoDB

    Go to backend folder to find more details.

  • Build/Package scripts lives in ci folder

More

You might also like:

  • Buildvis, transparency for your build pipeline's results and runtime
  • HeartBeat, calculates delivery metrics from CI/CD build data, revision control and project planning tools.
  • GoCD Analytics Plugin, provides insights into your GoCD instance.

License

Distributed under the MIT License. See LICENSE for more information

Contributors

Thanks goes to these wonderful people (emoji key):


Zhe ZHAO

💻

Hao Yang

💻

Jason Zhang

🚇

橘子小睿

💻

HUANG Binfang

💻

HeZhuConnie

💻

Mengqiu PENG

💻

Kiky

💻

Rong

💻

Piaopiao-TW

💻

zydxt

💻

ifeelcold1824

💻

快乐心情

💻

Taiyu Guo

💻

sasasakuna

💻

Chen

💻

ivy-pugai

💻

ZengXiaoXing

💻

HeyWen

💻

yong-wang1

💻

twpei

💻

Henning S.

💻

Prateek

💻

Karuppiah Natarajan

💻

Fabio Formosa

📖

This project follows the all-contributors specification. Contributions of any kind welcome!

Comments
  • Add contributors into README

    Add contributors into README

    Is your feature request related to a problem? Please describe. We've migrated this repo between various organizations many times, somehow we lost contributes' information, the GitHub right panel of the project home page only shows 7 contributors, however, there are more than 20

    Describe the solution you'd like Use all-contributors bot to add all contributors

    opened by hyrepo 104
  • (enhancement)solve the problem of progress bar don't display properly

    (enhancement)solve the problem of progress bar don't display properly

    https://github.com/thoughtworks/metrik/issues/95 Divide the fetching progress into 3 "steps" and show: fetching new runs, fetching in-progress runs and fetching commits. Remove redundant emitCb during mapping of runs and commits. Fix the problem of SSE cached due to the webpack. Fix the problem of tests' name and services' name don't match.

    opened by RoujingLiu 5
  • Optimize progress notification

    Optimize progress notification

    Describe the context of this enhancement For some CI/CD systems, i.e. Github Actions, the synchronization has two parts: sync pipeline executions and sync commit history, both of them cost much time. The current implementation of progress notification can't handle a situation like this.

    Describe the solution you'd like Use segmented progress, e.g. 50% for executions sync and 50% for commit sync

    enhancement 
    opened by hyrepo 5
  • fix sync failed error when fetching commits of deleted branch

    fix sync failed error when fetching commits of deleted branch

    Our team fix sync failed error when fetching commits of deleted branch as the following ideas: https://github.com/thoughtworks/metrik/issues/114#issuecomment-1140765521

    Also, we refactor GithubPipelineService following the picture below: WeChatWorkScreenshot_b00388a9-c06f-413d-a35f-1a7afff5b586

    We extract several services from GithubPipelineService to make it independent. Thus, we add some unit tests according to new services and fix GithubPipelineServiceTest.

    opened by ATPEEE 4
  • Recover and fix the horizontal scrollbar

    Recover and fix the horizontal scrollbar

    1. Based on historical commit, recovered the horizontal scrollbar when data is a lot
    2. Fix the flashing issue about scrollbars
    3. Fix the console warning about width attribute with negative value

    Current fixed look: scrollbar screenshot

    opened by LixingSun 4
  • Synchronize failed while fetching commits of deleted branch in Github

    Synchronize failed while fetching commits of deleted branch in Github

    Describe the bug Synchronize failed while fetching commits of deleted branch in Github

    To Reproduce Steps to reproduce the behavior:

    1. Add a Github Actions project in which a branch is deleted after merging its commits
    2. See error

    Expected behavior Synchronize should work and able to see metrics

    Desktop (please complete the following information):

    • OS: MAC
    • Browser: chrome
    • Version: HEAD

    Error thrown ERROR 2022-05-15 09:36:11.299 traceId: --- [pool-2-thread-1] m.p.r.a.SynchronizationApplicationService:Synchronize failed for pipeline [627ff5a82a30707ac0e4ed11 - ordermanagement], error: [feign.codec.DecodeException: Error while extracting response for type [java.util.List<metrik.project.infrastructure.github.feign.response.CommitResponse>] and content type [application/json;charset=utf-8]; nested exception is org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot deserialize instance of java.util.ArrayList<metrik.project.infrastructure.github.feign.response.CommitResponse> out of START_OBJECT token; nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of java.util.ArrayList<metrik.project.infrastructure.github.feign.response.CommitResponse> out of START_OBJECT token at [Source: (PushbackInputStream); line: 1, column: 1]] Exception in thread "pool-2-thread-1" metrik.project.exception.SynchronizationException: Synchronize failed at metrik.project.rest.applicationservice.SynchronizationApplicationService$synchronize$1.accept(SynchronizationApplicationService.kt:39) at metrik.project.rest.applicationservice.SynchronizationApplicationService$synchronize$1.accept(SynchronizationApplicationService.kt:14) at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183) at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1655) at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484) at java.base/java.util.stream.ForEachOps$ForEachTask.compute(ForEachOps.java:290) at java.base/java.util.concurrent.CountedCompleter.exec(CountedCompleter.java:746) at java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:290) at java.base/java.util.concurrent.ForkJoinTask.doInvoke(ForkJoinTask.java:408) at java.base/java.util.concurrent.ForkJoinTask.invoke(ForkJoinTask.java:736) at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateParallel(ForEachOps.java:159) at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateParallel(ForEachOps.java:173) at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:233) at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:497) at java.base/java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:661) at metrik.project.rest.applicationservice.SynchronizationApplicationService.synchronize(SynchronizationApplicationService.kt:34) at metrik.project.rest.applicationservice.SynchronizationApplicationService$$FastClassBySpringCGLIB$$e40c75eb.invoke() at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:687) at metrik.project.rest.applicationservice.SynchronizationApplicationService$$EnhancerBySpringCGLIB$$ff0f05fc.synchronize() at metrik.project.rest.SynchronizationController$sseSynchronization$1.run(SynchronizationController.kt:53) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) at java.base/java.lang.Thread.run(Thread.java:834)

    opened by prabhu43 4
  • When using persistent volume (Azure File Share/ Azure Disk) on AKS Cluster, the application failed to read the Git hub data.

    When using persistent volume (Azure File Share/ Azure Disk) on AKS Cluster, the application failed to read the Git hub data.

    Hello Awesome Team,

    Describe the bug

    When using persistent volume (Azure File Share/ Azure Disk) on AKS Cluster, the application failed to read the Git hub data, it kept on synchronizing but never loaded any data.

    However if we deploy the application on AKS, with out any external volume mount, it works fine.

    To Reproduce

    SetUp

    1. Create a Storage class (Azure File Share) on AKS Cluster

    2. Create a PVC (Persistent Volume Claim)

    3. Create a deployment and mount the /data/db on the above created PVC

    4. Create a load balancer service for accessing the application.

    5. Access the application using load balancer IP,

    6. Create a new project and configure with GITHUB repo using PAT tokens.

    Expected behavior

    The application would have loaded the GITHUB data and display the charts.

    Screenshots

    image

    image

    Cluster Information

    K8s Version : 1.20.7 Cloud Provider : Azure Persistent Volume : Azure File Share / Azure Disk

    opened by mmsajidcloud 4
  • Change the position of

    Change the position of "Go to Dashboard" button

    How to do

    1. remove button in ConfigSuccess div
    2. add button in ProjectConfig
    3. add showReloadCTA param to cover button show logic(only configSuccess call )



    Fix this issue: https://github.com/thoughtworks/metrik/issues/11
    opened by HE00L 3
  • fix: mismatch of parameter and value

    fix: mismatch of parameter and value

    this fixes an exception which appears when a branch name is passed into the api request to the sha query parameter. Fixed to be consistent witch parameters and values to branch, usage of sha would only get a single commit.

    opened by marcohutzsch1234 3
  • Log4j - Vulnerability Fix

    Log4j - Vulnerability Fix

    Hello Team,

    With the recent Log4j vulnerability, we have found that the current release of the docker image for Dora Metrics has issues.

    Are we planning to update the docker images with the latest upgrade(log4j)/ fix for the issue.

    Many thanks, Mohammed

    opened by mba484 3
  • Unable to see the metrics for Jenkins project

    Unable to see the metrics for Jenkins project

    Describe the bug A clear and concise description of what the bug is. I am able to integrate the tool with Jenkins pipeline. However when I go to dashboard, I get an error "Handler dispatch failed; nested exception is kotlin.NotImplementedError: An operation is not implemented: Not yet implemented".

    Expected behavior Expected to see the metrics data

    Screenshots Screenshot 2021-05-06 at 3 37 40 PM

    Desktop (please complete the following information):

    • OS: Mac Big Sur
    • Browser Brave
    • Version 1.23.75
    opened by jaideeprana 3
  • Unable to pull data for github actions project with 40 branches and over 11k commits

    Unable to pull data for github actions project with 40 branches and over 11k commits

    Describe the bug

    1. Start the container: docker run -d -p 80:80 --name metrik public.ecr.aws/j2s5d3z8/4-key-metrics:latest
    2. Configure a Github Action Pipeline for small project. Works
    3. Configure a Github Action Pipeline for project with lots of activity. Doesnt work

    To Reproduce I guess to reproduce just use a big project. The current project it is failing on has 40 branches and over 11k commits

    Expected behavior Show the data for big project

    Desktop (please complete the following information):

    • OS: MacOS
    • Browser n/a
    • Version n/a

    Additional context Add any other context about the problem here.

    INFO 2022-12-21 01:36:07.368 traceId: --- [pool-25-thread-1] m.p.d.s.g.CommitService:Get Github Commits - Sending request to Github Feign Client with owner: https://api.github.com/repos/ORG/REPO, since: 1970-01-01T08:00, until: 2022-12-20T23:46:41, branch: EPIC-XXX/OMITED, pageIndex: 79
    ERROR 2022-12-21 01:36:07.485 traceId:a8d88d43711058d9 --- [http-nio-9000-exec-8] m.e.GlobalExceptionHandler:Unexpected exception happened with error message: null
    org.springframework.web.context.request.async.AsyncRequestTimeoutException
    	at org.springframework.web.context.request.async.TimeoutDeferredResultProcessingInterceptor.handleTimeout(TimeoutDeferredResultProcessingInterceptor.java:42)
    	at org.springframework.web.context.request.async.DeferredResultInterceptorChain.triggerAfterTimeout(DeferredResultInterceptorChain.java:79)
    	at org.springframework.web.context.request.async.WebAsyncManager.lambda$startDeferredResultProcessing$5(WebAsyncManager.java:438)
    	at java.base/java.util.ArrayList.forEach(Unknown Source)
    	at org.springframework.web.context.request.async.StandardServletAsyncWebRequest.onTimeout(StandardServletAsyncWebRequest.java:151)
    	at org.apache.catalina.core.AsyncListenerWrapper.fireOnTimeout(AsyncListenerWrapper.java:44)
    	at org.apache.catalina.core.AsyncContextImpl.timeout(AsyncContextImpl.java:136)
    	at org.apache.catalina.connector.CoyoteAdapter.asyncDispatch(CoyoteAdapter.java:153)
    	at org.apache.coyote.AbstractProcessor.dispatch(AbstractProcessor.java:241)
    	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:59)
    	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:888)
    	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1597)
    	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
    	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    	at java.base/java.lang.Thread.run(Unknown Source)
    WARN 2022-12-21 01:36:07.486 traceId:a8d88d43711058d9 --- [http-nio-9000-exec-8] o.s.w.s.m.m.a.ExceptionHandlerExceptionResolver:Failure in @ExceptionHandler metrik.exception.GlobalExceptionHandler#handleThrowable(Throwable)
    org.springframework.http.converter.HttpMessageNotWritableException: No converter for [class metrik.exception.ErrorResponse] with preset Content-Type 'text/event-stream'
    	at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.writeWithMessageConverters(AbstractMessageConverterMethodProcessor.java:299)
    	at org.springframework.web.servlet.mvc.method.annotation.HttpEntityMethodProcessor.handleReturnValue(HttpEntityMethodProcessor.java:219)
    	at org.springframework.web.method.support.HandlerMethodReturnValueHandlerComposite.handleReturnValue(HandlerMethodReturnValueHandlerComposite.java:78)
    	at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:124)
    	at org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver.doResolveHandlerMethodException(ExceptionHandlerExceptionResolver.java:424)
    	at org.springframework.web.servlet.handler.AbstractHandlerMethodExceptionResolver.doResolveException(AbstractHandlerMethodExceptionResolver.java:75)
    	at org.springframework.web.servlet.handler.AbstractHandlerExceptionResolver.resolveException(AbstractHandlerExceptionResolver.java:141)
    	at org.springframework.web.servlet.handler.HandlerExceptionResolverComposite.resolveException(HandlerExceptionResolverComposite.java:80)
    	at org.springframework.web.servlet.DispatcherServlet.processHandlerException(DispatcherServlet.java:1321)
    	at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1132)
    	at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1078)
    	at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:961)
    	at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)
    	at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898)
    	at javax.servlet.http.HttpServlet.service(HttpServlet.java:626)
    	at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)
    	at javax.servlet.http.HttpServlet.service(HttpServlet.java:733)
    	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
    	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    	at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)
    	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
    	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.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:103)
    	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    	at org.springframework.cloud.sleuth.instrument.web.servlet.TracingFilter.doFilter(TracingFilter.java:68)
    	at org.springframework.cloud.sleuth.autoconfig.instrument.web.LazyTracingFilter.doFilter(TraceWebServletConfiguration.java:121)
    	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.metrics.web.servlet.WebMvcMetricsFilter.doFilterInternal(WebMvcMetricsFilter.java:93)
    	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
    	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.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:103)
    	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.ApplicationDispatcher.invoke(ApplicationDispatcher.java:712)
    	at org.apache.catalina.core.ApplicationDispatcher.doDispatch(ApplicationDispatcher.java:633)
    	at org.apache.catalina.core.ApplicationDispatcher.dispatch(ApplicationDispatcher.java:601)
    	at org.apache.catalina.core.AsyncContextImpl$AsyncRunnable.run(AsyncContextImpl.java:586)
    	at org.apache.catalina.core.AsyncContextImpl.doInternalDispatch(AsyncContextImpl.java:354)
    	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199)
    	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97)
    	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542)
    	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:143)
    	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
    	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78)
    	at org.apache.catalina.connector.CoyoteAdapter.asyncDispatch(CoyoteAdapter.java:235)
    	at org.apache.coyote.AbstractProcessor.dispatch(AbstractProcessor.java:241)
    	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:59)
    	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:888)
    	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1597)
    	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
    	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    	at java.base/java.lang.Thread.run(Unknown Source)
    WARN 2022-12-21 01:36:07.486 traceId:a8d88d43711058d9 --- [http-nio-9000-exec-8] o.s.w.s.m.s.DefaultHandlerExceptionResolver:Async request timed out
    WARN 2022-12-21 01:36:07.486 traceId:a8d88d43711058d9 --- [http-nio-9000-exec-8] o.s.w.s.m.s.DefaultHandlerExceptionResolver:Resolved [org.springframework.web.context.request.async.AsyncRequestTimeoutException]
    INFO 2022-12-21 01:36:08.088 traceId: --- [pool-25-thread-1] m.p.d.s.g.CommitService:Get Github Commits - Sending request to Github Feign Client with owner: https://api.github.com/repos/ORG/REPO, since: 1970-01-01T08:00, until: 2022-12-20T23:46:41, branch: EPIC-XXXXX/OMITED, pageIndex: 80
    

    After failing it will restart, successfully pull the information from the small repository then fail again on the big one.

    opened by mikhaelsantos 0
  • How to build the docker image from this repository

    How to build the docker image from this repository

    Describe the context of this enhancement Hi, I know there are several places that document the process of running the app locally (from backend, frontend, and ci folder). But I don't see there's a comprehensive step-by-step to build the app into a docker image and eventually run the app.

    Describe the solution you'd like A centralized content on how to build the app from scratch (backend & frontend) until the process of docker build and docker run so that we can run the app with ease without running the components (backend, frontend, DB) individually.

    Additional context So far, here's what I've done to build the app from scratch:

    • build the frontend app (by running npm run build:prod)
    • build the backend app (by running ./gradlew clean build)
    • collect artifacts (by following the steps here)
    • build the docker image by running docker build -t <docker-image-name>.
    • finally, run the container by running docker run -d -p 3000:80 --name <container-name> <docker-image-name>:latest

    But the above method didn't work as the app has been returning 502 Bad Gateway. So I'd appreciate if there's any pointer on what went wrong from the above steps 🙇

    Thank you very much!

    enhancement 
    opened by wildan3105 0
  • Question: How is lead time for change is calculated?

    Question: How is lead time for change is calculated?

    Hello

    I started experimenting with metrik and wanted to ask you how lead time for changes metrik is calculated. In the last 18 days, I had 3 deployments to production in my GitHub organization. When I adjusted the dates in the metrik ui to cover those periods and set the workflow name to the production deployment workflow, I see the following charts. How can the lead time to change metric in the last 20 days be equal to 88 days? Any help is appreciated.

    image image

    opened by dgokcin 2
  • Integrating metrik into a real-world project

    Integrating metrik into a real-world project

    Describe the context of this enhancement This request relates to documentation and the ability to guide a user on how to integrate metrik in an existing application. As a technical lead, I would like to integrate metrik with a real-world full-stack application, however, I don't have enough documentation showing how to do it.

    Describe the solution you'd like Ideally the solution shall provide an example with a full-stack application with GitHub as the source control and any cloud provider such as AWS. The documentation shall show how to integrate with metrik and provide examples show the various metrics such as deployment frequency, lead time etc.

    Additional context The idea would be to build up something similar to the Cypress Real World app https://github.com/cypress-io/cypress-realworld-app which in that case provides examples on how to integrate with different auth providers.

    enhancement 
    opened by simonboland 0
  • [Github Actions] Make workflow configurable in pipeline config

    [Github Actions] Make workflow configurable in pipeline config

    Describe the context of this enhancement Currently for Github Actions project, by default for backend it will fetch all workflow for the repo. However in some cases not all workflow are meaningful and never be cared to visualize (e.g. scanning, specific testing, spiking ,etc.). If we could exclude these unimportant workflows, we could speed up the data sync as well as reduce some potential issue may have due to them.

    Describe the solution you'd like Enable workflow configuration in the pipeline config.

    Task 1: Specify workflows when create Github Actions pipeline

    • (FE) Enhance the pipeline config UI with a section below Personal Access Token
    • (FE) Once user clicks Verify button and verify successfully, a workflow API is also triggered to visualize the list of existing workflows
    • (FE) User is able to select the workflows that they are interested in
    • (BE) createPipeline(POST /project/{projectId}/pipeline) API accepts the additional configuration about workflow selections and store into DB

    Task 2: Update workflows when configure Github Actions pipeline

    • (FE) Display workflow config once Pipeline config popup is triggered, and initially fetch the latest workflow list
    • (FE) User is able to update the workflow select and make an update
    • (FE) Once URL/Personal Access Token is updated, the "Verify" triggering will update the workflow list accordingly
    • (BE) getPipeline (GET /project/{projectId}/pipeline/{pipelineId}) API returns the additional configuration about workflow selections from DB
    • (BE) updatePipeline (PUT /project/{projectId}/pipeline/{pipelineId}) API accepts the additional configuration about workflow selections and store into DB

    Task 3: Sync data with only configured workflows

    • (BE) Replace querying all runs to query only the configured workflows' run by the workflow run API
    • (BE) For compatibility, if workflows are not configured yet when the sync is triggered, keep to query all runs

    Additional context The config of workflow need to store both workflow name and workflow id.

    UI position for the new config: image

    enhancement 
    opened by LixingSun 1
  • API is failing while integrating the Metrick with Jenkins pipeline

    API is failing while integrating the Metrick with Jenkins pipeline

    Hi Team,

    I have installed the Metrick and tried to connect with the Jenkins pipeline. When I have specified the URL of the pipeline it does not take. It is showing the error: "jenkins.abc.com executing GET https://jenkins.abc.com/jenkins/job/OMS_Metrick/wfapi/."

    As I have to debug this error. It is due that the GET method that Metrick is not taking it. {"status":500,"message":"Request method 'GET' not supported"}

    Please look into this issue. As i am trying for DevOps metrics. @hyrepo Yang

    opened by yugandharakulkarni-cg-devops 0
Releases(1.5.3)
Owner
Thoughtworks
Thoughtworks
Reactor is key value database and is a great alternative to Shared Preferences.

Reactor Reactor is a fast and secure key-value library for Android, and has an embedded database based on the JSON structure and is a great alternativ

mr amir abbas 37 Oct 30, 2022
✔️ Secure, simple key-value storage for Android

Hawk 2.0 Secure, simple key-value storage for android Important Note This version has no backward compatibility with Hawk 1+ versions. If you still wa

Orhan Obut 3.9k Dec 20, 2022
Expirable Disk Lru Cache is a secure(with encryption) wrapper for [DiskLruCache](https://github.com/JakeWharton/DiskLruCache) that allows expiring of key/value pairs by specifying evictionTimeSpan. It has very simple API.

ExpirableDiskLruCache ExpirableDiskLruCache is a wrapper for DiskLruCache that allows expiring of key/value pairs by specifying evictionTimeSpan. It h

Vijay Rawat 24 Oct 3, 2022
A Virtual Machine For Assessing Android applications, Reverse Engineering and Malware Analysis

Androl4b AndroL4b is an android security virtual machine based on ubuntu-mate includes the collection of latest framework, tutorials and labs from dif

null 1k Dec 27, 2022
Access and process various types of personal data in Android with a set of easy, uniform, and privacy-friendly APIs.

PrivacyStreams PrivacyStreams is an Android library for easy and privacy-friendly personal data access and processing. It offers a functional programm

null 269 Dec 1, 2022
Utility tool to make you a computer ninja.

Cmd Window Never spend 6 minutes doing something by hand when you can spend 6 hours failing to automate it - Zhuowej Zhang What is this about? This to

Marcin Radoszewski 3 Feb 1, 2022
KmmCaching - An application that illustrates fetching data from remote data source and caching it in local storage

An application that illustrates fetching data from remote data source and caching it in local storage for both IOS and Android platforms using Kotlin Multiplatform Mobile and SqlDelight.

Felix Kariuki 5 Oct 6, 2022
A simple and easy to use stopwatch and timer library for android

TimeIt Now with Timer support! A simple and easy to use stopwatch and timer library for android Introduction A stopwatch can be a very important widge

Yashovardhan Dhanania 35 Dec 10, 2022
Very easy to use wrapper library for Android SharePreferences

Treasure English document Treasure是一个Android平台上基于SharePreferences的偏好存储库,只需要定义接口,无需编写实现,默认支持Serializable和Parcelable。运行时0反射,不仅使用方便而且性能和原生写法几乎无差别。 使用方法 1

星一 507 Nov 12, 2022
Trail is a simple logging system for Java and Android. Create logs using the same API and the library will detect automatically in which platform the code is running.

Trail Trail is a simple logging system for Java and Android. Create logs using the same API and the library will detect automatically in which platfor

Mauricio Togneri 13 Aug 29, 2022
compaKTset is a small library aimed at providing you with the most memory efficient Set implementation for any particular data type of your choosing.

compaKTset is a small library aimed at providing you with the most memory efficient Set implementation for any particular data type of your choosing.

Ignat Beresnev 3 Nov 16, 2021
A command line utility to help you investigate the sensitive data associated with Macie findings.

Macie Finding Data Reveal This project contains a command line utility to help you investigate the sensitive data associated with Macie findings.

AWS Samples 8 Nov 16, 2022
BinGait is a tool to disassemble and view java class files, developed by BinClub.

BinGait Tool to diassemble java class files created by x4e. Usage To run BinGait, run java -jar target/bingait-shadow.jar and BinGait will launch. If

null 18 Jul 7, 2022
A tool to validate text inside TextInputLayout

Download dependencies { implementation 'com.github.anderscheow:validator:2.2.1' } Usage Available rules LengthRule MaxRule MinRule NotEmptyRule NotN

Anders Cheow 129 Nov 25, 2022
recompose is a tool for converting Android layouts in XML to Kotlin code using Jetpack Compose.

recompose is a tool for converting Android layouts in XML to Kotlin code using Jetpack Compose.

Sebastian Kaspari 565 Jan 2, 2023
An intelligent diff tool for the output of Gradle's dependencies task

Dependency Tree Diff An intelligent diff tool for the output of Gradle's dependencies task which always shows the path to the root dependency. +--- c

Jake Wharton 693 Dec 26, 2022
A command line tool for NFT stuff

MartaKli is a command line tool to help you generate your NFT pfp project. Current features: Generate batch of images using different layers and corre

Martabak Cult 2 Oct 4, 2022
KDoctor - A command-line tool that helps to set up the environment for Kotlin Multiplatform Mobile app development

KDoctor is a command-line tool that helps to set up the environment for Kotlin Multiplatform Mobile app development.

Kotlin 331 Dec 29, 2022
Tool to look for several security related Android application vulnerabilities

Quick Android Review Kit This tool is designed to look for several security related Android application vulnerabilities, either in source code or pack

LinkedIn 2.9k Jan 2, 2023