grafana / grafana/pyroscope-java

BUG Memory leak when use agent

Offen
#135 7 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen
Vorherrschende Sprache
Java
Sterne
126
Forks
48
Ø Merge
4 T. 14 Std.
Gemergte PRs (30 T.)
5

Beschreibung

I use 0.12.0 agent upload JFR data to my backend.
```

io.pyroscope
agent
0.12.0

```

Upload code:
```
Config profileConfig = new Config.Builder()
.setFormat(Format.JFR)
.setLogLevel(Logger.Level.INFO)
.setProfilingEvent(EventType.ITIMER)
.setProfilingAlloc("0")
.setProfilingInterval(Duration.ofMillis(10))
.setUploadInterval(Duration.ofSeconds(5))
.build();
GalileoProfileExporter exporter = new GalileoProfileExporter(resource, DEFAULT_RETRY);
PyroscopeAgent.start(new PyroscopeAgent.Options.Builder(profileConfig).setExporter(exporter).build());
```

My exporter:
```
public class GalileoProfileExporter implements Exporter {
private static final Duration TIMEOUT = Duration.ofSeconds(10);
private static final String ENDPOINT = "https://xxxxxxxxxxxxx";

final Ocp.Resource resource;
final int ingestMaxTries;
final Logger logger = new DefaultLogger(Logger.Level.INFO, System.err);
final OkHttpClient client = new OkHttpClient.Builder()
.connectTimeout(TIMEOUT)
.readTimeout(TIMEOUT)
.callTimeout(TIMEOUT)
.build();

public GalileoProfileExporter(Ocp.Resource resource, int ingestMaxTries) {
this.resource = resource;
this.ingestMaxTries = ingestMaxTries;
}

@Override
public void export(Snapshot snapshot) {
final HttpUrl url = HttpUrl.parse(ENDPOINT);
logger.log(Logger.Level.INFO, "Upload profile. %s %s JFR: %s",
snapshot.started.toString(), snapshot.ended.toString(), snapshot.data.length);
byte[] reqBody = constructReqBody(snapshot);
byte[] compressedData = new byte[0];
try {
compressedData = Snappy.compress(reqBody);
} catch (IOException e) {
logger.log(Logger.Level.ERROR, "Error compress snapshot.");
}
MediaType type = MediaType.parse("application/octet-stream");
RequestBody jfrBody = RequestBody.create(compressedData, type);
Request.Builder request = new Request.Builder()
.post(jfrBody)
.url(url);
request.header("language", "java");

try (Response response = client.newCall(request.build()).execute()) {
int status = response.code();
if (status >= 400) {
ResponseBody body = response.body();
final String responseBody;
if (body == null) {
responseBody = "";
} else {
responseBody = body.string();
}
logger.log(Logger.Level.ERROR, "Error uploading snapshot: %s %s", status, responseBody);
}
if (status == 200) {
logger.log(Logger.Level.INFO, "Success upload jfr");
}
} catch (final IOException e) {
logger.log(Logger.Level.ERROR, "Error uploading snapshot: %s", e.getMessage());
}
}

private byte[] constructReqBody(Snapshot snapshot) {
Otp.Profile.Builder profile = Otp.Profile.newBuilder()
.setName("jfr")
.setType("cpu")
.setData(ByteString.copyFrom(snapshot.data));
Otp.ProfilesBatch profilesBatch = Otp.ProfilesBatch.newBuilder()
.setSequence(1)
.setStart(snapshot.started.toEpochMilli() / 1000)
.setEnd(snapshot.ended.toEpochMilli() / 1000)
.setResource(this.resource)
.addProfiles(profile)
.build();
return profilesBatch.toByteArray();
}

}
```

When I opened the agent report, I found that the memory was constantly rising, and I suspected there was a memory leak situation
![image](https://github.com/grafana/pyroscope-java/assets/28734521/58bdceff-c78a-4977-86e4-1abc24a365ba)

Is there anyone who has encountered similar problems with me, or is there a problem with where I wrote it? Thanks

Beitragsleitfaden

Für dieses Repository ist kein Beitragsleitfaden indexiert

Rechercherichtung

Beginnen Sie beim Aufruf von PyroscopeAgent.start und verfolgen Sie die Verarbeitung wiederholter Snapshots durch den Agenten sowie die benutzerdefinierte Implementierung von GalileoProfileExporter.export. Reproduzieren Sie den Bericht mit der bereitgestellten 0.12.0-Konfiguration und überwachen Sie den Speicher, während Uploads ausgeführt werden. Als abgeschlossen gilt die Aufgabe, wenn die Ursache des anhaltenden Speicherwachstums identifiziert ist und der Agent abgeschlossene Profiling-Daten nicht mehr unerwartet zurückhält.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
java
Bereich
observability-sre
Issue-Typ
Bug
Schwierigkeit
4/5
Geschätzter Aufwand
3-5 Tage
Aktivitätsstatus
Veraltet
Klarheit
Muss geklärt werden
Anfängerfreundlichkeit
25/100

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.