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

Display a warning when data is stale #202

Merged
merged 1 commit into from
Jan 21, 2025
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
4 changes: 4 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,10 @@
<artifactId>quarkus-prettytime</artifactId>
<version>2.0.10</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-yaml</artifactId>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-junit5</artifactId>
Expand Down
11 changes: 10 additions & 1 deletion src/main/java/io/quarkus/status/StatusService.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package io.quarkus.status;

import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit;
import java.util.Arrays;
import java.util.List;

Expand Down Expand Up @@ -104,8 +105,16 @@ private StatusLine fromIssue(Issue issue) {
StatusLine statusLine = new StatusLine();
statusLine.name = issue.title;
statusLine.url = issue.url;
statusLine.statusCode = issue.isOpen() ? StatusCode.FAILURE : StatusCode.SUCCESS;
statusLine.statusCode = determineStatusCode(issue);
statusLine.failureMessage = issue.getFailureMessage();
return statusLine;
}

private static StatusCode determineStatusCode(Issue issue) {
if (issue.updatedAt == null || ChronoUnit.DAYS.between(issue.updatedAt, LocalDateTime.now()) > 2) {
return StatusCode.WARNING;
}

return issue.isOpen() ? StatusCode.FAILURE : StatusCode.SUCCESS;
}
}
43 changes: 42 additions & 1 deletion src/main/java/io/quarkus/status/github/GitHubService.java
Original file line number Diff line number Diff line change
@@ -1,15 +1,23 @@
package io.quarkus.status.github;

import java.io.IOException;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;
import jakarta.json.JsonArray;
Expand All @@ -26,11 +34,23 @@
import io.smallrye.graphql.client.GraphQLError;
import io.smallrye.graphql.client.Response;
import io.smallrye.graphql.client.dynamic.api.DynamicGraphQLClient;
import org.jboss.logging.Logger;

@ApplicationScoped
public class GitHubService {

private static final Logger LOG = Logger.getLogger(GitHubService.class);
private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss'Z'");
private static final String STATUS_MARKER = "<!-- status.quarkus.io/status:";
private static final String END_OF_MARKER = "-->";
private static final Pattern STATUS_PATTERN = Pattern.compile(STATUS_MARKER + "\r?\n(.*?)\r?\n" + END_OF_MARKER,
Pattern.DOTALL);
private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper(new YAMLFactory());

static {
OBJECT_MAPPER.registerModule(new JavaTimeModule());
OBJECT_MAPPER.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
}

@Inject
@GraphQLClient("github")
Expand Down Expand Up @@ -167,11 +187,11 @@ private Issue extractIssue(JsonObject issueJson) {
issue.id = issueJson.getString("id");
issue.title = issueJson.getString("title");
issue.number = issueJson.getInt("number");
issue.author = jsonb.fromJson(issueJson.getJsonObject("author").toString(), User.class);
issue.body = issueJson.getString("body");
issue.closedAt = issueJson.get("closedAt") != JsonValue.NULL
? LocalDateTime.parse(issueJson.getString("closedAt"), DATE_TIME_FORMATTER)
: null;
issue.updatedAt = extractUpdatedAt(issue.body);
issue.state = issueJson.getString("state");
issue.url = issueJson.getString("url");

Expand Down Expand Up @@ -235,4 +255,25 @@ private static class Templates {
public static native TemplateInstance labelsStats(String owner, String repo, String label, int count, String cursor);
}

private static LocalDateTime extractUpdatedAt(String body) {
if (body == null || body.isBlank()) {
return null;
}

Matcher matcher = STATUS_PATTERN.matcher(body);
if (!matcher.find()) {
return null;
}

try {
Status status = OBJECT_MAPPER.readValue(matcher.group(1), Status.class);
return LocalDateTime.ofInstant(status.updatedAt, ZoneId.systemDefault());
} catch (Exception e) {
LOG.warn("Unable to extract Status from issue body", e);
return null;
}
}

public record Status(Instant updatedAt, boolean failure, String repository, Long runId) {
}
}
1 change: 1 addition & 0 deletions src/main/java/io/quarkus/status/github/Issue.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ public class Issue implements Comparable<Issue> {
public String url;
public String state;
public LocalDateTime closedAt;
public LocalDateTime updatedAt;

public User author;

Expand Down
4 changes: 4 additions & 0 deletions src/main/java/io/quarkus/status/model/StatusLine.java
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,10 @@ public boolean isFailure() {
return statusCode == StatusCode.FAILURE;
}

public boolean isWarning() {
return statusCode == StatusCode.WARNING;
}

@Override
public boolean equals(Object o) {
if (this == o) {
Expand Down
4 changes: 3 additions & 1 deletion src/main/resources/templates/StatusResource/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
</thead>
<tbody>
{#for line in section.value.lines}
<tr class="{#if line.failure}negative{#else}positive{/if}">
<tr class="{#if line.failure}negative{#else if line.warning}warning{#else}positive{/if}">
<td>
<div>
<strong><a href="{line.url}" target="_blank">{line.name}</a></strong>
Expand All @@ -48,6 +48,8 @@
<td class="center aligned">
{#if line.failure}
<i class="red icon exclamation circle large"></i>
{#else if line.warning}
<i class="orange icon attention circle large" title="Data looks stale"></i>
{#else}
<i class="green icon check circle large"></i>
{/if}
Expand Down
Loading