Skip to content
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
18 changes: 18 additions & 0 deletions deploy/examples/sample-aiprovider-ollama.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
---
apiVersion: podmortem.redhat.com/v1alpha1
kind: AIProvider
metadata:
name: ollama-local
namespace: podmortem-system
spec:
providerId: "ollama"
apiUrl: "http://ollama-service.ai-models.svc.cluster.local:11434"
modelId: "mistral:7b"
timeoutSeconds: 60
maxRetries: 2
cachingEnabled: true
temperature: 0.3
maxTokens: 500
additionalConfig:
stream: "false"
num_predict: "500"
14 changes: 14 additions & 0 deletions deploy/examples/sample-podmortem.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
---
apiVersion: podmortem.redhat.com/v1alpha1
kind: Podmortem
metadata:
name: monitor-my-apps
namespace: default
spec:
podSelector:
matchLabels:
app: "my-application"
aiProviderRef:
name: "ollama-local"
namespace: "podmortem-system"
aiAnalysisEnabled: true
10 changes: 9 additions & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
<skipITs>true</skipITs>
<surefire-plugin.version>3.5.3</surefire-plugin.version>

<podmortem.common.lib.version>1.0-f094e1c-SNAPSHOT</podmortem.common.lib.version>
<podmortem.common.lib.version>1.0-1db4e13-SNAPSHOT</podmortem.common.lib.version>
</properties>

<repositories>
Expand Down Expand Up @@ -68,6 +68,14 @@
<groupId>io.quarkus</groupId>
<artifactId>quarkus-kubernetes-client</artifactId>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-rest-client</artifactId>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-rest-client-jackson</artifactId>
</dependency>
<dependency>
<groupId>com.redhat.podmortem</groupId>
<artifactId>common</artifactId>
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package com.redhat.podmortem.operator.service;

import com.redhat.podmortem.common.model.analysis.AnalysisResult;
import com.redhat.podmortem.common.model.kube.aiprovider.AIProvider;
import com.redhat.podmortem.common.model.provider.AIResponse;
import io.smallrye.mutiny.Uni;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;
import org.eclipse.microprofile.rest.client.inject.RestClient;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@ApplicationScoped
public class AIInterfaceClient {

private static final Logger log = LoggerFactory.getLogger(AIInterfaceClient.class);

@Inject @RestClient AIInterfaceRestClient restClient;

public Uni<AIResponse> generateExplanation(
AnalysisResult analysisResult, AIProvider aiProvider) {
log.debug("Sending AI explanation request for analysis");
return restClient
.generateExplanation(analysisResult, aiProvider)
.onItem()
.invoke(response -> log.debug("Received AI explanation response"))
.onFailure()
.invoke(throwable -> log.error("AI explanation generation failed", throwable));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package com.redhat.podmortem.operator.service;

import com.redhat.podmortem.common.model.analysis.AnalysisResult;
import com.redhat.podmortem.common.model.kube.aiprovider.AIProvider;
import com.redhat.podmortem.common.model.provider.AIResponse;
import io.smallrye.mutiny.Uni;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.ws.rs.Consumes;
import jakarta.ws.rs.POST;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.Produces;
import jakarta.ws.rs.core.MediaType;
import org.eclipse.microprofile.rest.client.inject.RegisterRestClient;

@ApplicationScoped
@RegisterRestClient(configKey = "ai-interface")
@Path("/api/v1")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public interface AIInterfaceRestClient {

@POST
@Path("/analyze")
Uni<AIResponse> generateExplanation(AnalysisResult analysisResult, AIProvider aiProvider);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package com.redhat.podmortem.operator.service;

import com.redhat.podmortem.common.model.analysis.AnalysisResult;
import com.redhat.podmortem.common.model.kube.podmortem.PodFailureData;
import io.smallrye.mutiny.Uni;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;
import org.eclipse.microprofile.rest.client.inject.RestClient;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@ApplicationScoped
public class LogParserClient {

private static final Logger log = LoggerFactory.getLogger(LogParserClient.class);

@Inject @RestClient LogParserRestClient restClient;

public Uni<AnalysisResult> analyzeLog(PodFailureData failureData) {
log.debug(
"Sending log analysis request for pod: {}",
failureData.getPod().getMetadata().getName());
return restClient
.parseLogs(failureData)
.onItem()
.invoke(
result ->
log.debug(
"Received analysis result for pod: {}",
failureData.getPod().getMetadata().getName()))
.onFailure()
.invoke(
throwable ->
log.error(
"Log analysis failed for pod: {}",
failureData.getPod().getMetadata().getName(),
throwable));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package com.redhat.podmortem.operator.service;

import com.redhat.podmortem.common.model.analysis.AnalysisResult;
import com.redhat.podmortem.common.model.kube.podmortem.PodFailureData;
import io.smallrye.mutiny.Uni;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.ws.rs.Consumes;
import jakarta.ws.rs.POST;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.Produces;
import jakarta.ws.rs.core.MediaType;
import org.eclipse.microprofile.rest.client.inject.RegisterRestClient;

@ApplicationScoped
@RegisterRestClient(configKey = "log-parser")
@Path("/")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public interface LogParserRestClient {

@POST
@Path("/parse")
Uni<AnalysisResult> parseLogs(PodFailureData failureData);
}
Loading
Loading