స్ప్రింగ్ బూట్లో కొలతలు మరియు ట్రేసింగ్ ఏకీకృతం
పంపిణీ వ్యవస్థలతో పనిచేసేటప్పుడు, అన్ని పొరలలో పరిశీలనను నిర్ధారించడం చాలా ముఖ్యం. స్ప్రింగ్ బూట్లో, లాగ్లు ఇప్పటికే ట్రేస్ ఐడిలను సంగ్రహించగలవు, ఇది సేవల్లో అభ్యర్థనలను ట్రాక్ చేయడం సులభం చేస్తుంది. ఏదేమైనా, ఈ ట్రేస్ మరియు స్పాన్ ఐడిలను కొలమానాల్లోకి చేర్చడం సవాలుగా మిగిలిపోయింది. 📊
మీరు పనితీరు సమస్యను డీబగ్ చేస్తున్నారని g హించుకోండి మరియు మీరు ట్రేస్ ఐడిలతో లాగ్లను చూడవచ్చు కాని వాటిని నిర్దిష్ట మెట్రిక్ డేటాతో పరస్పరం అనుసంధానించలేరు. ఈ పరిమితి సిస్టమ్ ప్రవర్తనను సమర్థవంతంగా విశ్లేషించడం కష్టతరం చేస్తుంది. ఈ అంతరాన్ని తగ్గించడానికి, వివిధ పొరలు -రెస్ట్ కంట్రోలర్లు మరియు JPA రిపోజిటరీల నుండి కొలమానాలను ట్యాగ్ చేయడానికి మాకు ఒక మార్గం అవసరం.
ప్రోమేతియస్, గ్రాఫానా మరియు జిప్కిన్ శక్తివంతమైన పర్యవేక్షణ మరియు ట్రేసింగ్ సామర్థ్యాలను అందిస్తున్నాయి. లాగ్లు అభ్యర్థన ప్రవాహాలపై అంతర్దృష్టులను అందిస్తున్నప్పటికీ, ట్రేస్ సందర్భాన్ని కొలమానాలకు అటాచ్ చేయడం అన్ని పొరలలో దృశ్యమానతను పెంచుతుంది. దీని అర్థం మేము నిర్దిష్ట వినియోగదారు అభ్యర్థనలతో జాప్యం, లోపం రేట్లు మరియు నిర్గమాంశను పరస్పరం అనుసంధానించవచ్చు.
ఈ గైడ్లో, ప్రతి అప్లికేషన్ పొర వద్ద కొలమానాలకు ట్రేస్ మరియు స్పాన్ ఐడిలను చేర్చడానికి స్ప్రింగ్ బూట్ను ఎలా కాన్ఫిగర్ చేయాలో మేము అన్వేషిస్తాము. మీరు REST ఎండ్ పాయింట్లు లేదా డేటాబేస్ పరస్పర చర్యలతో వ్యవహరిస్తున్నా, ఈ విధానం పూర్తి-స్టాక్ పరిశీలనను సాధించడంలో మీకు సహాయపడుతుంది. 🚀
కమాండ్ | ఉపయోగం యొక్క ఉదాహరణ |
---|---|
OncePerRequestFilter | ఒక అభ్యర్థనను నిర్ధారించే స్ప్రింగ్ బూట్ ఫిల్టర్ జీవితచక్రానికి ఒకసారి మాత్రమే ప్రాసెస్ చేయబడిందని నిర్ధారిస్తుంది, ఇది కొలమానాలకు ట్రేస్ ఐడిలను జోడించడానికి ఉపయోగపడుతుంది. |
MeterRegistry.counter() | కస్టమ్ మెట్రిక్ కౌంటర్ను సృష్టించడానికి మరియు పెంచడానికి ఉపయోగిస్తారు, మైక్రోమీటర్లో ట్రేస్ ఐడిలతో కొలమానాలను ట్యాగింగ్ చేయడానికి అనుమతిస్తుంది. |
TraceContextHolder.getTraceId() | ప్రస్తుత ట్రేస్ ఐడిని ట్రేసింగ్ సందర్భం నుండి తిరిగి పొందే కస్టమ్ యుటిలిటీ పద్ధతి, పొరలలో సరైన సహసంబంధాన్ని నిర్ధారిస్తుంది. |
StatementInspector | డేటాబేస్ కొలమానాలను ట్యాగ్ చేయడానికి ఉపయోగపడే అమలుకు ముందు SQL ప్రశ్నల మార్పు మరియు తనిఖీని అనుమతించే హైబర్నేట్ నుండి ఇంటర్ఫేస్. |
fetch("http://localhost:9090/api/v1/query") | ఫ్రంటెండ్లో రియల్ టైమ్ ట్రేస్ ఐడి-ఆధారిత కొలమానాలను ప్రదర్శించడానికి ప్రోమేతియస్ మెట్రిక్స్ డేటాను దాని API ద్వారా పొందుతుంది. |
response.json() | ప్రోమేతియస్ API ప్రతిస్పందనను JSON ఫార్మాట్లోకి అన్వయించడం, రియాక్ట్లో కొలమానాలను ప్రాసెస్ చేయడం మరియు ప్రదర్శించడం సులభం చేస్తుంది. |
meterRegistry.counter().increment() | ఒక నిర్దిష్ట మెట్రిక్ కౌంటర్ను స్పష్టంగా పెంచుతుంది, ప్రతి అభ్యర్థన లేదా డేటాబేస్ ప్రశ్నను ట్రేస్ ఐడిలతో పాటు లెక్కించడానికి అనుమతిస్తుంది. |
filterChain.doFilter() | గొలుసులోని తదుపరి ఫిల్టర్కు అభ్యర్థన మరియు ప్రతిస్పందనను పాస్ చేస్తుంది, కొలమానాలను జోడించిన తర్వాత సాధారణ అభ్యర్థన ప్రాసెసింగ్ను నిర్ధారిస్తుంది. |
useEffect(() =>useEffect(() => {}, []) | కాంపోనెంట్ మౌంట్లో ఒకసారి నడుస్తున్న రియాక్ట్ హుక్, డాష్బోర్డ్ లోడ్ అయినప్పుడు ప్రోమేతియస్ కొలమానాలను పొందటానికి ఇక్కడ ఉపయోగించబడుతుంది. |
కొలమానాల్లో ట్రేస్ ఐడితో పరిశీలనను పెంచుతుంది
ఆధునిక పంపిణీ వ్యవస్థలలో, డీబగ్గింగ్ మరియు పనితీరు పర్యవేక్షణకు లాగ్లు మరియు కొలమానాలను పరస్పరం అనుసంధానించడం చాలా ముఖ్యం. మేము అభివృద్ధి చేసిన స్క్రిప్ట్లు సమగ్రపరచడానికి సహాయపడతాయి ట్రేస్ ఐడిలను మరియు స్పాన్ ID లు స్ప్రింగ్ బూట్ యొక్క పరిశీలనాత్మక స్టాక్లోకి. మొదటి స్క్రిప్ట్ ఉపయోగించి కస్టమ్ ఫిల్టర్ను పరిచయం చేస్తుంది ఒకసారి పెరెక్వెస్ట్ ఫిల్టర్ ఇన్కమింగ్ HTTP అభ్యర్థనలను అడ్డగించడానికి మరియు మైక్రోమీటర్ కొలమానాలకు ట్రేస్ ID లను అటాచ్ చేయడానికి. ఇది ప్రతి HTTP అభ్యర్థనను లెక్కించబడి, దాని సంబంధిత ట్రేస్ ID తో లేబుల్ చేయబడిందని నిర్ధారిస్తుంది. ఇది లేకుండా, బహుళ సేవల్లో వ్యక్తిగత అభ్యర్థనను గుర్తించడం సవాలుగా ఉంటుంది. కంట్రోలర్, సేవ లేదా డేటాబేస్ పొరలో సమస్య ఉందో లేదో తెలియకుండా నెమ్మదిగా API ప్రతిస్పందనను పరిష్కరించడం g హించుకోండి! 🚀
మా రెండవ స్క్రిప్ట్ పరపతి ద్వారా నిలకడ పొరపై దృష్టి పెడుతుంది హైబర్నేట్ యొక్క స్టేట్మెంట్ ఇన్స్పెక్టర్. ఈ భాగం అమలుకు ముందు SQL ప్రశ్నలను తనిఖీ చేస్తుంది, ఇది డేటాబేస్ పరస్పర చర్యలకు ట్రేస్ ID లను జోడించడానికి అనుమతిస్తుంది. దీని అర్థం మేము HTTP అభ్యర్థనలను మాత్రమే కాకుండా, అవి ఉత్పత్తి చేసే ప్రశ్నలను కూడా ట్రాక్ చేయవచ్చు, ఇది సిస్టమ్ పనితీరు యొక్క పూర్తి-స్టాక్ వీక్షణను ఇస్తుంది. ఉదాహరణకు, రిపోజిటరీ పద్ధతిని పిలిచే ఎండ్ పాయింట్ నెమ్మదిగా ప్రశ్నలకు దారితీస్తే, మా ట్యాగ్ చేయబడిన కొలమానాలు మూల కారణాన్ని గుర్తించడంలో సహాయపడతాయి. ఉపయోగించడం ద్వారా మీటర్ రిజిస్ట్రీ.కౌంటర్ (), ప్రశ్న అమలు చేయబడిన ప్రతిసారీ మేము మెట్రిక్ను పెంచుతాము, డేటాబేస్ పనితీరులో పూర్తి దృశ్యమానతను నిర్ధారిస్తాము.
ఫ్రంట్ ఎండ్ వైపు, మేము ట్రేస్ ఐడిలతో ట్యాగ్ చేయబడిన ప్రోమేతియస్ కొలమానాలను పొందే మరియు ప్రదర్శించే సరళమైన రియాక్ట్ డాష్బోర్డ్ను నిర్మించాము. ఉపయోగం పొందండి () నిజ సమయంలో ప్రోమేతియస్ నుండి డేటాను తిరిగి పొందడానికి మా అప్లికేషన్ అనుమతిస్తుంది. ఒక వినియోగదారు డాష్బోర్డ్ను తెరిచినప్పుడు, వారు ట్రేస్ ఐడికి చేసిన అభ్యర్థనల సంఖ్యను చూస్తారు, జట్లకు బ్యాకెండ్ కార్యాచరణను వినియోగదారు ప్రవర్తనతో పరస్పరం అనుసంధానించడానికి సహాయపడుతుంది. డెవలపర్ ఒక నిర్దిష్ట అభ్యర్థనను డీబగ్ చేయడం వల్ల దాని ట్రేస్ ఐడిని త్వరగా చూస్తుంది మరియు ఇది ఎన్ని ప్రశ్నలను ప్రేరేపించిందో చూడవచ్చు. ఈ విధానం పర్యవేక్షణను మెరుగుపరుస్తుంది మరియు డీబగ్గింగ్ సెషన్లను మరింత సమర్థవంతంగా చేస్తుంది. 📊
అంతిమంగా, ఈ పరిష్కారాలు అన్ని అప్లికేషన్ పొరలలో అతుకులు లేని ట్రేసింగ్ అనుభవాన్ని సృష్టించడానికి కలిసి పనిచేస్తాయి. స్ప్రింగ్ బూట్ యొక్క పరిశీలనాత్మక సాధనాలను ప్రోమేతియస్, గ్రాఫానా మరియు జిప్కిన్లతో కలపడం ద్వారా, మేము పూర్తి-స్టాక్ పర్యవేక్షణను సాధిస్తాము. డెవలపర్లు ఇప్పుడు ఎంట్రీ పాయింట్ల నుండి డేటాబేస్ ప్రశ్నలకు అభ్యర్థనలను సులభంగా ట్రాక్ చేయవచ్చు. ఇది సిస్టమ్ విశ్వసనీయతను మెరుగుపరచడమే కాక, డీబగ్గింగ్ సమయాన్ని కూడా తగ్గిస్తుంది. వాస్తవ-ప్రపంచ దృష్టాంతంలో, ఇది పనితీరు అడ్డంకులను గుర్తించడానికి మరియు సమస్యలు పెరిగే ముందు వనరుల కేటాయింపును ఆప్టిమైజ్ చేయడానికి సహాయపడుతుంది. అటువంటి పరిశీలనాత్మక ఉత్తమ పద్ధతులను అమలు చేయడం మెరుగైన పనితీరు, వేగంగా ట్రబుల్షూటింగ్ మరియు మెరుగైన వినియోగదారు అనుభవాన్ని నిర్ధారిస్తుంది. 🚀
పూర్తి పరిశీలన కోసం కొలమానాల్లో ట్రేస్ ఐడిని అమలు చేయడం
మైక్రోమీటర్ మరియు స్లీత్తో స్ప్రింగ్ బూట్ ఉపయోగించి బ్యాక్ ఎండ్ సొల్యూషన్
// Import necessary packages
import io.micrometer.core.instrument.MeterRegistry;
import org.springframework.stereotype.Component;
import org.springframework.web.filter.OncePerRequestFilter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Optional;
@Component
public class TraceIdMetricFilter extends OncePerRequestFilter {
private final MeterRegistry meterRegistry;
public TraceIdMetricFilter(MeterRegistry meterRegistry) {
this.meterRegistry = meterRegistry;
}
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
String traceId = Optional.ofNullable(request.getHeader("traceId")).orElse("unknown");
meterRegistry.counter("http.requests", "traceId", traceId).increment();
filterChain.doFilter(request, response);
}
}
ట్రేస్ ID లను JPA తో డేటాబేస్ కొలమానాల్లో అనుసంధానించడం
హైబర్నేట్ మరియు మైక్రోమీటర్తో స్ప్రింగ్ బూట్ ఉపయోగించి బ్యాక్ ఎండ్ సొల్యూషన్
// Import necessary packages
import io.micrometer.core.instrument.MeterRegistry;
import org.hibernate.resource.jdbc.spi.StatementInspector;
import org.springframework.stereotype.Component;
@Component
public class TraceIdStatementInspector implements StatementInspector {
private final MeterRegistry meterRegistry;
public TraceIdStatementInspector(MeterRegistry meterRegistry) {
this.meterRegistry = meterRegistry;
}
@Override
public String inspect(String sql) {
String traceId = TraceContextHolder.getTraceId(); // Assume TraceContextHolder gets the traceId
meterRegistry.counter("database.queries", "traceId", traceId).increment();
return sql;
}
}
ఫ్రంటెండ్ ఇంటిగ్రేషన్: ట్రేస్ ఐడి కొలమానాలను ప్రదర్శిస్తోంది
రియాక్ట్ మరియు ప్రోమేతియస్ API ఉపయోగించి ఫ్రంట్ ఎండ్ అమలు
import React, { useEffect, useState } from "react";
const MetricsDashboard = () => {
const [metrics, setMetrics] = useState([]);
useEffect(() => {
fetch("http://localhost:9090/api/v1/query?query=http_requests_total")
.then(response => response.json())
.then(data => setMetrics(data.data.result));
}, []);
return (
<div>
<h2>Trace ID Metrics</h2>
<ul>
{metrics.map((metric, index) => (
<li key={index}>{metric.metric.traceId}: {metric.value[1]} requests</li>
))}
</ul>
</div>
);
};
export default MetricsDashboard;
స్ప్రింగ్ బూట్ మెట్రిక్స్లో అధునాతన ట్రేసిబిలిటీ
మేము ఇంటిగ్రేటింగ్ అన్వేషించాము ట్రేస్ ఐడిలను విశ్రాంతి మరియు డేటాబేస్ కొలమానాల్లోకి, పంపిణీ లావాదేవీలను పర్యవేక్షించడం మరొక కీలకమైన అంశం. మైక్రోసర్వీస్ ఆర్కిటెక్చర్లో, ఒకే వినియోగదారు అభ్యర్థన తరచుగా బహుళ సేవలను విస్తరిస్తుంది, ఇది అభ్యర్థన ఎలా ప్రచారం చేస్తుందో ట్రాక్ చేయడం అవసరం. స్ప్రింగ్ బూట్, ఓపెంటెలెమెట్రీ వంటి సాధనాలతో కలిపినప్పుడు, ప్రతి సేవా పరస్పర చర్య కోసం వివరణాత్మక స్పాన్లను సంగ్రహించడానికి అనుమతిస్తుంది. API లను బ్యాకెండ్ చేయడానికి ఫ్రంటెండ్ UI నుండి అభ్యర్థనలు మరియు డేటాబేస్లు అన్నీ ఒకే ట్రేస్ క్రింద సంబంధం కలిగి ఉన్నాయని ఇది నిర్ధారిస్తుంది. ఇది లేకుండా, పనితీరు అడ్డంకులను డీబగ్ చేయడం చాలా కష్టం అవుతుంది. 🔍
మరో ముఖ్యమైన అంశం అసమకాలిక కార్యకలాపాలకు గుర్తించదగినది. ఆధునిక అనువర్తనాల్లో, కాఫ్కా లేదా రాబిట్ఎమ్క్యూతో ఈవెంట్-ఆధారిత చర్యలు వంటి అనేక ప్రక్రియలు నేపథ్యంలో నడుస్తాయి. సందేశ క్యూలలో ట్రేస్ ఐడిలను ప్రచారం చేయడానికి స్ప్రింగ్ బూట్ను కాన్ఫిగర్ చేయడం ద్వారా, అసమకాలిక పనులు కూడా సరిగ్గా గుర్తించబడుతున్నాయని మేము నిర్ధారించగలము. ఉదాహరణకు, ఇ-కామర్స్ వ్యవస్థలో ఆర్డర్ ఉంచినప్పుడు, బహుళ సేవలు జాబితా, చెల్లింపు మరియు నోటిఫికేషన్లను నిర్వహిస్తాయి. ఈ దశలలో ఒకదానిలో ఒక సమస్య తలెత్తితే, సరైన విస్తరణ లేకుండా మూల కారణాన్ని గుర్తించడం దాదాపు అసాధ్యం.
ట్రేసింగ్ను అమలు చేసేటప్పుడు భద్రత మరియు డేటా సమగ్రత కూడా కీలకం. ట్రేస్ ఐడిలను బాహ్యంగా బహిర్గతం చేయడం సరిగా నిర్వహించకపోతే భద్రతా ప్రమాదాలకు దారితీస్తుంది. ఉత్తమ పద్ధతులు సున్నితమైన ట్రేస్ సమాచారాన్ని ఫిల్టర్ చేయడం మరియు లాగ్లు మరియు కొలమానాలు అనుకోకుండా వ్యక్తిగత డేటాను బహిర్గతం చేయకుండా చూసుకోవడం. అంతేకాకుండా, రోల్-బేస్డ్ యాక్సెస్ కంట్రోల్తో గుర్తించదగిన సామర్థ్యాన్ని కలపడం వల్ల అధీకృత సిబ్బంది మాత్రమే వివరణాత్మక ట్రేసింగ్ సమాచారాన్ని ప్రశ్నించగలరని నిర్ధారిస్తుంది. ఈ భద్రతా చర్యలను అమలు చేయడం వలన పరిశీలన అనేది బాధ్యతగా కాకుండా ఆస్తిగా మిగిలిపోతుందని నిర్ధారిస్తుంది. 🚀
స్ప్రింగ్ బూట్ ట్రేసిబిలిటీ గురించి తరచుగా అడిగే ప్రశ్నలు
- స్ప్రింగ్ బూట్ అప్లికేషన్లో నేను ట్రేసింగ్ను ఎలా ప్రారంభించగలను?
- స్ప్రింగ్ బూట్ ట్రేసింగ్కు మద్దతు ఇస్తుంది Spring Cloud Sleuth మరియు Micrometer. తగిన డిపెండెన్సీలను జోడించడం ద్వారా మరియు ట్రేసింగ్ లక్షణాలను కాన్ఫిగర్ చేయడం ద్వారా, మీరు ట్రేస్ మరియు స్పాన్ ఐడిలను స్వయంచాలకంగా సంగ్రహించవచ్చు.
- నేను బహుళ మైక్రోసర్వీస్లలో ట్రేస్ ఐడిలను ట్రాక్ చేయవచ్చా?
- అవును, ఉపయోగించడం ద్వారా Zipkin లేదా Jaeger పంపిణీ చేయబడిన ట్రేసింగ్ లైబ్రరీలతో పాటు, ట్రేస్ ఐడిలను బహుళ సేవల్లో ప్రచారం చేయవచ్చు, ఇది అభ్యర్థన ప్రవాహాలలో పూర్తి దృశ్యమానతను అనుమతిస్తుంది.
- నేను కాఫ్కా సందేశాలకు ట్రేస్ ఐడిలను ఎలా అటాచ్ చేయగలను?
- మీరు ఉపయోగించి సందేశ శీర్షికలలో ట్రేస్ ఐడిని చేర్చవచ్చు KafkaTemplate.send(). సందేశాలను తీసుకునేటప్పుడు, ట్రేస్ ఐడిని సంగ్రహించి, ట్రేసింగ్ సందర్భంలో సెట్ చేయండి.
- గ్రాఫానా డాష్బోర్డులలో ట్రేస్ ఐడిలను చూడటం సాధ్యమేనా?
- అవును, ప్రోమేతియస్ మరియు గ్రాఫానాను కాన్ఫిగర్ చేయడం ద్వారా Micrometer tags, మీరు మీ గ్రాఫానా ప్యానెల్స్లో నేరుగా ట్రేస్-సంబంధిత కొలమానాలను దృశ్యమానం చేయవచ్చు.
- ట్రేస్ ఐడి భద్రతను నేను ఎలా నిర్ధారించగలను?
- ట్రేస్ సమాచారాన్ని రక్షించడానికి, బాహ్య API లు మరియు లాగ్లలో ట్రేస్ ID లను బహిర్గతం చేయకుండా ఉండండి. ఉపయోగం log sanitization లాగ్లను నిల్వ చేయడానికి ముందు సున్నితమైన డేటాను ఫిల్టర్ చేసే పద్ధతులు.
స్ప్రింగ్ బూట్ అనువర్తనాలలో పరిశీలనను ఆప్టిమైజ్ చేయడం
అన్ని పొరలలో ట్రేస్ ఐడిలను అమలు చేయడం అనువర్తన ప్రవర్తనపై లోతైన అంతర్దృష్టులను అందిస్తుంది. ట్రేస్ మరియు స్పాన్ ఐడిలతో కొలమానాలను ట్యాగ్ చేయడం ద్వారా, డెవలపర్లు ఎండ్-టు-ఎండ్ దృశ్యమానతను పొందుతారు, నెమ్మదిగా అభ్యర్థనలు లేదా విఫలమైన సేవలను నిర్ధారించడం సులభం చేస్తుంది. ప్రోమేతియస్ మరియు గ్రాఫానా వంటి సాధనాలను ఉపయోగించడం నిజ-సమయ పర్యవేక్షణను మరింత పెంచుతుంది.
డీబగ్గింగ్కు మించి, నిర్మాణాత్మక ట్రేసింగ్ పనితీరు ఆప్టిమైజేషన్ను మెరుగుపరచడంలో సహాయపడుతుంది. అసమర్థ డేటాబేస్ ప్రశ్నలను గుర్తించడం, మైక్రోసర్వీస్ జాప్యాన్ని ట్రాక్ చేయడం మరియు అభ్యర్థన ప్రవాహాలను విశ్లేషించడం చాలా సరళంగా మారుతుంది. ట్రేసింగ్ టెక్నిక్లలో పెట్టుబడులు పెట్టడం మెరుగైన ట్రబుల్షూటింగ్ మాత్రమే కాకుండా సున్నితమైన వినియోగదారు అనుభవాన్ని కూడా నిర్ధారిస్తుంది. 🔍
కొలమానాల్లో ట్రేస్ ఐడిలను అమలు చేయడానికి మూలాలు మరియు సూచనలు
- మైక్రోమీటర్ మరియు స్లీత్తో స్ప్రింగ్ బూట్లో ట్రేసింగ్ను సమగ్రపరచడంపై అధికారిక డాక్యుమెంటేషన్: స్ప్రింగ్ క్లౌడ్ స్లీత్ .
- స్ప్రింగ్ బూట్ అనువర్తనాలను పర్యవేక్షించడానికి ప్రోమేతియస్ మరియు గ్రాఫానాను ఏర్పాటు చేయడానికి గైడ్: ప్రోమేతియస్ డాక్యుమెంటేషన్ .
- జిప్కిన్ ఉపయోగించి పంపిణీ చేసిన ట్రేసింగ్ కోసం ఉత్తమ పద్ధతులు: జిప్కిన్ ఆర్కిటెక్చర్ .
- హైబర్నేట్ ప్రశ్నలలో ట్రేస్ మరియు స్పాన్ ఐడి ప్రచారం అమలు: హైబర్నేట్ యూజర్ గైడ్ .