Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update release metrics to include the component level release issue and owner details #63

Merged
merged 1 commit into from
Aug 21, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import org.opensearchmetrics.metrics.general.*;
import org.opensearchmetrics.metrics.label.LabelMetrics;
import org.opensearchmetrics.metrics.release.ReleaseBranchChecker;
import org.opensearchmetrics.metrics.release.ReleaseIssueChecker;
import org.opensearchmetrics.metrics.release.ReleaseLabelIssuesFetcher;
import org.opensearchmetrics.metrics.release.ReleaseLabelPullsFetcher;
import org.opensearchmetrics.metrics.release.ReleaseMetrics;
Expand Down Expand Up @@ -143,7 +144,7 @@
public ReleaseMetrics getReleaseMetrics(OpenSearchUtil openSearchUtil, ObjectMapper objectMapper,
ReleaseRepoFetcher releaseRepoFetcher, ReleaseLabelIssuesFetcher releaseLabelIssuesFetcher,
ReleaseLabelPullsFetcher releaseLabelPullsFetcher, ReleaseVersionIncrementChecker releaseVersionIncrementChecker,
ReleaseBranchChecker releaseBranchChecker, ReleaseNotesChecker releaseNotesChecker) {
return new ReleaseMetrics(openSearchUtil, objectMapper, releaseRepoFetcher, releaseLabelIssuesFetcher, releaseLabelPullsFetcher, releaseVersionIncrementChecker, releaseBranchChecker, releaseNotesChecker);
ReleaseBranchChecker releaseBranchChecker, ReleaseNotesChecker releaseNotesChecker, ReleaseIssueChecker releaseIssueChecker) {
return new ReleaseMetrics(openSearchUtil, objectMapper, releaseRepoFetcher, releaseLabelIssuesFetcher, releaseLabelPullsFetcher, releaseVersionIncrementChecker, releaseBranchChecker, releaseNotesChecker, releaseIssueChecker);

Check warning on line 148 in src/main/java/org/opensearchmetrics/dagger/MetricsModule.java

View check run for this annotation

Codecov / codecov/patch

src/main/java/org/opensearchmetrics/dagger/MetricsModule.java#L148

Added line #L148 was not covered by tests
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.UUID;
import java.util.stream.Collectors;
import java.util.stream.Stream;
Expand Down Expand Up @@ -153,6 +154,7 @@

Map<String, String> metricFinalData =
Arrays.stream(releaseInputs)
.filter(ReleaseInputs::getTrack)

Check warning on line 157 in src/main/java/org/opensearchmetrics/metrics/MetricsCalculation.java

View check run for this annotation

Codecov / codecov/patch

src/main/java/org/opensearchmetrics/metrics/MetricsCalculation.java#L157

Added line #L157 was not covered by tests
.flatMap(releaseInput -> releaseMetrics.getReleaseRepos(releaseInput.getVersion()).stream()
.flatMap(repo -> {
ReleaseMetricsData releaseMetricsData = new ReleaseMetricsData();
Expand All @@ -166,6 +168,7 @@
throw new RuntimeException(e);
}
releaseMetricsData.setReleaseVersion(releaseInput.getVersion());
releaseMetricsData.setVersion(releaseInput.getVersion());

Check warning on line 171 in src/main/java/org/opensearchmetrics/metrics/MetricsCalculation.java

View check run for this annotation

Codecov / codecov/patch

src/main/java/org/opensearchmetrics/metrics/MetricsCalculation.java#L171

Added line #L171 was not covered by tests
releaseMetricsData.setReleaseState(releaseInput.getState());
releaseMetricsData.setIssuesOpen(releaseMetrics.getReleaseLabelIssues(releaseInput.getVersion(), repo, "open", false));
releaseMetricsData.setAutocutIssuesOpen(releaseMetrics.getReleaseLabelIssues(releaseInput.getVersion(), repo, "open", true));
Expand All @@ -175,6 +178,16 @@
releaseMetricsData.setVersionIncrement(releaseMetrics.getReleaseVersionIncrement(releaseInput.getVersion(), repo, releaseInput.getBranch()));
releaseMetricsData.setReleaseNotes(releaseMetrics.getReleaseNotes(releaseInput.getVersion(), repo, releaseInput.getBranch()));
releaseMetricsData.setReleaseBranch(releaseMetrics.getReleaseBranch(releaseInput.getVersion(), repo));
String[] releaseOwners = releaseMetrics.getReleaseOwners(releaseInput.getVersion(), repo);
releaseMetricsData.setReleaseOwners(releaseOwners);
releaseMetricsData.setReleaseOwnerExists(Optional.ofNullable(releaseOwners)

Check warning on line 183 in src/main/java/org/opensearchmetrics/metrics/MetricsCalculation.java

View check run for this annotation

Codecov / codecov/patch

src/main/java/org/opensearchmetrics/metrics/MetricsCalculation.java#L181-L183

Added lines #L181 - L183 were not covered by tests
.map(owners -> owners.length > 0)
.orElse(false));
String releaseIssue = releaseMetrics.getReleaseIssue(releaseInput.getVersion(), repo);
releaseMetricsData.setReleaseIssue(releaseIssue);
releaseMetricsData.setReleaseIssueExists(Optional.ofNullable(releaseIssue)

Check warning on line 188 in src/main/java/org/opensearchmetrics/metrics/MetricsCalculation.java

View check run for this annotation

Codecov / codecov/patch

src/main/java/org/opensearchmetrics/metrics/MetricsCalculation.java#L185-L188

Added lines #L185 - L188 were not covered by tests
.map(str -> !str.isEmpty())
.orElse(false));

Check warning on line 190 in src/main/java/org/opensearchmetrics/metrics/MetricsCalculation.java

View check run for this annotation

Codecov / codecov/patch

src/main/java/org/opensearchmetrics/metrics/MetricsCalculation.java#L190

Added line #L190 was not covered by tests
return Stream.of(releaseMetricsData);
}))
.collect(Collectors.toMap(ReleaseMetricsData::getId,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,32 +1,33 @@
package org.opensearchmetrics.metrics.release;

public enum ReleaseInputs {
VERSION_3_0_0("3.0.0", "open", "main"),
VERSION_2_12_0("2.12.0", "closed", "2.12"),
VERSION_2_13_0("2.13.0", "closed", "2.13"),
VERSION_2_14_0("2.14.0", "closed", "2.14"),
VERSION_2_15_0("2.15.0", "closed", "2.15"),
VERSION_2_16_0("2.16.0", "closed", "2.16"),
VERSION_2_17_0("2.17.0", "open", "2.x"),
VERSION_1_3_15("1.3.15", "closed", "1.3"),
VERSION_1_3_16("1.3.16", "closed", "1.3"),
VERSION_1_3_17("1.3.17", "closed", "1.3"),
VERSION_1_3_18("1.3.18", "closed", "1.3"),
VERSION_1_3_19("1.3.19", "open", "1.3");
VERSION_3_0_0("3.0.0", "open", "main", true),
VERSION_2_12_0("2.12.0", "closed", "2.12", false),
VERSION_2_13_0("2.13.0", "closed", "2.13", false),
VERSION_2_14_0("2.14.0", "closed", "2.14", false),
VERSION_2_15_0("2.15.0", "closed", "2.15", true),
VERSION_2_16_0("2.16.0", "closed", "2.16", true),
VERSION_2_17_0("2.17.0", "open", "2.x", true),
VERSION_1_3_15("1.3.15", "closed", "1.3", false),
VERSION_1_3_16("1.3.16", "closed", "1.3", false),
VERSION_1_3_17("1.3.17", "closed", "1.3", false),
VERSION_1_3_18("1.3.18", "closed", "1.3", true),
VERSION_1_3_19("1.3.19", "open", "1.3", true);

private final String version;
private final String state;
private final String branch;

ReleaseInputs(String version, String state, String branch) {
private final boolean track;

ReleaseInputs(String version, String state, String branch, boolean track) {
this.version = version;
this.state = state;
this.branch = branch;
this.track = track;
}

public String getVersion() {
return version;
}
public String getVersion() { return version; }

public String getState() {
return state;
Expand All @@ -35,6 +36,10 @@ public String getState() {
public String getBranch() {
return branch;
}

public boolean getTrack() {
return track;
}
public static ReleaseInputs[] getAllReleaseInputs() {
return values();
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
package org.opensearchmetrics.metrics.release;

import org.opensearch.action.search.SearchRequest;
import org.opensearch.action.search.SearchResponse;
import org.opensearch.index.query.BoolQueryBuilder;
import org.opensearch.index.query.QueryBuilders;
import org.opensearch.search.SearchHit;
import org.opensearch.search.aggregations.AggregationBuilders;
import org.opensearch.search.aggregations.bucket.terms.Terms;
import org.opensearch.search.builder.SearchSourceBuilder;
import org.opensearchmetrics.util.OpenSearchUtil;

import javax.inject.Inject;
import java.util.Arrays;

public class ReleaseIssueChecker {

@Inject
public ReleaseIssueChecker() {}

public String[] releaseOwners(String releaseVersion, String repo, OpenSearchUtil openSearchUtil) {
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
boolQueryBuilder.must(QueryBuilders.matchQuery("repository.keyword", repo));
boolQueryBuilder.must(QueryBuilders.matchQuery("title.keyword", "[RELEASE] Release version " + releaseVersion));
boolQueryBuilder.must(QueryBuilders.matchQuery("issue_pull_request", false));
SearchRequest searchRequest = new SearchRequest("github_issues");
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(boolQueryBuilder);
searchSourceBuilder.size(9000);
searchSourceBuilder.aggregation(
AggregationBuilders.terms("issue_assignees")
prudhvigodithi marked this conversation as resolved.
Show resolved Hide resolved
.field("issue_assignees.keyword")
.size(50)
);
searchRequest.source(searchSourceBuilder);
SearchResponse searchResponse = openSearchUtil.search(searchRequest);
Terms termsAgg = searchResponse.getAggregations().get("issue_assignees");
return termsAgg.getBuckets().stream()
.map(Terms.Bucket::getKeyAsString)
.toArray(String[]::new);
}

public String releaseIssue(String releaseVersion, String repo, OpenSearchUtil openSearchUtil) {
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
boolQueryBuilder.must(QueryBuilders.matchQuery("repository.keyword", repo));
boolQueryBuilder.must(QueryBuilders.matchQuery("title.keyword", "[RELEASE] Release version " + releaseVersion));
boolQueryBuilder.must(QueryBuilders.matchQuery("issue_pull_request", false));
SearchRequest searchRequest = new SearchRequest("github_issues");
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(boolQueryBuilder);
searchSourceBuilder.size(9000);
searchRequest.source(searchSourceBuilder);
SearchResponse searchResponse = openSearchUtil.search(searchRequest);
SearchHit[] hits = searchResponse.getHits().getHits();
return Arrays.stream(hits)
.findFirst()
.map(hit -> (String) hit.getSourceAsMap().get("html_url"))
.orElse(null);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -21,12 +21,13 @@

private final ReleaseNotesChecker releaseNotesChecker;

private final ReleaseIssueChecker releaseIssueChecker;

@Inject
public ReleaseMetrics(OpenSearchUtil openSearchUtil, ObjectMapper objectMapper, ReleaseRepoFetcher releaseRepoFetcher,
ReleaseLabelIssuesFetcher releaseLabelIssuesFetcher, ReleaseLabelPullsFetcher releaseLabelPullsFetcher,
ReleaseVersionIncrementChecker releaseVersionIncrementChecker, ReleaseBranchChecker releaseBranchChecker,
ReleaseNotesChecker releaseNotesChecker) {
ReleaseNotesChecker releaseNotesChecker, ReleaseIssueChecker releaseIssueChecker) {

Check warning on line 30 in src/main/java/org/opensearchmetrics/metrics/release/ReleaseMetrics.java

View check run for this annotation

Codecov / codecov/patch

src/main/java/org/opensearchmetrics/metrics/release/ReleaseMetrics.java#L30

Added line #L30 was not covered by tests
this.openSearchUtil = openSearchUtil;
this.objectMapper = objectMapper;
this.releaseRepoFetcher = releaseRepoFetcher;
Expand All @@ -35,41 +36,40 @@
this.releaseVersionIncrementChecker = releaseVersionIncrementChecker;
this.releaseBranchChecker = releaseBranchChecker;
this.releaseNotesChecker = releaseNotesChecker;
this.releaseIssueChecker = releaseIssueChecker;

Check warning on line 39 in src/main/java/org/opensearchmetrics/metrics/release/ReleaseMetrics.java

View check run for this annotation

Codecov / codecov/patch

src/main/java/org/opensearchmetrics/metrics/release/ReleaseMetrics.java#L39

Added line #L39 was not covered by tests
}


public List<String> getReleaseRepos(String releaseVersion) {
return releaseRepoFetcher.getReleaseRepos(releaseVersion);
}


public Long getReleaseLabelIssues(String releaseVersion, String repo, String issueState, boolean autoCut) {
return releaseLabelIssuesFetcher.releaseLabelIssues(releaseVersion, repo, issueState, autoCut, openSearchUtil);
}



public Long getReleaseLabelPulls(String releaseVersion, String repo, String pullState) {
return releaseLabelPullsFetcher.releaseLabelPulls(releaseVersion, repo, pullState, openSearchUtil);
}




public boolean getReleaseVersionIncrement (String releaseVersion, String repo, String branch) {
return releaseVersionIncrementChecker.releaseVersionIncrement(releaseVersion, repo, branch, objectMapper, openSearchUtil);
}


public Boolean getReleaseNotes (String releaseVersion, String repo, String releaseBranch) {
return releaseNotesChecker.releaseNotes(releaseVersion, repo, releaseBranch);
}



public Boolean getReleaseBranch (String releaseVersion, String repo) {
return releaseBranchChecker.releaseBranch(releaseVersion, repo);
}

public String[] getReleaseOwners (String releaseVersion, String repo) {
return releaseIssueChecker.releaseOwners(releaseVersion, repo, openSearchUtil);

Check warning on line 67 in src/main/java/org/opensearchmetrics/metrics/release/ReleaseMetrics.java

View check run for this annotation

Codecov / codecov/patch

src/main/java/org/opensearchmetrics/metrics/release/ReleaseMetrics.java#L67

Added line #L67 was not covered by tests
}

public String getReleaseIssue (String releaseVersion, String repo) {
return releaseIssueChecker.releaseIssue(releaseVersion, repo, openSearchUtil);

Check warning on line 71 in src/main/java/org/opensearchmetrics/metrics/release/ReleaseMetrics.java

View check run for this annotation

Codecov / codecov/patch

src/main/java/org/opensearchmetrics/metrics/release/ReleaseMetrics.java#L71

Added line #L71 was not covered by tests
}


}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import lombok.Data;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Data
Expand All @@ -23,6 +24,9 @@ public class ReleaseMetricsData {
@JsonProperty("release_version")
private String releaseVersion;

@JsonProperty("version")
private String version;

@JsonProperty("release_state")
private String releaseState;

Expand All @@ -49,12 +53,25 @@ public class ReleaseMetricsData {
@JsonProperty("release_branch")
private boolean releaseBranch;

@JsonProperty("release_owners")
private String[] releaseOwners;

@JsonProperty("release_owner_exists")
private boolean releaseOwnerExists;

@JsonProperty("release_issue")
private String releaseIssue;

@JsonProperty("release_issue_exists")
private boolean releaseIssueExists;

public String toJson(ObjectMapper mapper) throws JsonProcessingException {
Map<String, Object> data = new HashMap<>();
data.put("id", id);
data.put("current_date", currentDate);
data.put("repository", repository);
data.put("release_version", releaseVersion);
data.put("version", version);
data.put("release_state", releaseState);
data.put("issues_open", issuesOpen);
data.put("autocut_issues_open", autocutIssuesOpen);
Expand All @@ -64,6 +81,10 @@ public String toJson(ObjectMapper mapper) throws JsonProcessingException {
data.put("version_increment", versionIncrement);
data.put("release_notes", releaseNotes);
data.put("release_branch", releaseBranch);
data.put("release_owners", releaseOwners);
data.put("release_owner_exists", releaseOwnerExists);
data.put("release_issue", releaseIssue);
data.put("release_issue_exists", releaseIssueExists);

return mapper.writeValueAsString(data);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,22 @@ public void testGetBranch() {
assertEquals("1.3", ReleaseInputs.VERSION_1_3_19.getBranch());
}

@Test
public void testGetTrack() {
assertEquals(true, ReleaseInputs.VERSION_3_0_0.getTrack());
assertEquals(false, ReleaseInputs.VERSION_2_12_0.getTrack());
assertEquals(false, ReleaseInputs.VERSION_2_13_0.getTrack());
assertEquals(false, ReleaseInputs.VERSION_2_14_0.getTrack());
assertEquals(true, ReleaseInputs.VERSION_2_15_0.getTrack());
assertEquals(true, ReleaseInputs.VERSION_2_16_0.getTrack());
assertEquals(true, ReleaseInputs.VERSION_2_17_0.getTrack());
assertEquals(false, ReleaseInputs.VERSION_1_3_15.getTrack());
assertEquals(false, ReleaseInputs.VERSION_1_3_16.getTrack());
assertEquals(false, ReleaseInputs.VERSION_1_3_17.getTrack());
assertEquals(true, ReleaseInputs.VERSION_1_3_18.getTrack());
assertEquals(true, ReleaseInputs.VERSION_1_3_19.getTrack());
}

@Test
public void testGetAllReleaseInputs() {
ReleaseInputs[] releaseInputs = ReleaseInputs.getAllReleaseInputs();
Expand Down
Loading
Loading