UNPKG

@echoteam/signoz-react

Version:

SignOz React JS - Library untuk monitoring dan tracing aplikasi React menggunakan OpenTelemetry dan SignOz

353 lines (280 loc) 10.1 kB
# @echoteam/signoz-react Library React untuk monitoring dan tracing aplikasi menggunakan OpenTelemetry dan SignOz. ## 🚀 Fitur - **Tracing Otomatis**: Integrasi OpenTelemetry untuk tracing HTTP requests, fetch, dan XMLHttpRequest - **Error Boundary**: Komponen React untuk menangkap dan melaporkan error dengan tracing - **Error Page**: Halaman error untuk React Router dengan integrasi tracing - **TypeScript Support**: Dukungan penuh untuk TypeScript - **Zero Configuration**: Mudah digunakan dengan environment variables - **Customizable**: ErrorPage dan ErrorBoundary dapat dikustomisasi sesuai kebutuhan ## 📚 Dokumentasi - [Konfigurasi CORS Backend](./BACKEND_CORS_SETUP.md) - Panduan lengkap setup CORS di berbagai framework backend - [Troubleshooting](./TROUBLESHOOTING.md) - Solusi untuk masalah umum - [OpenTelemetry Documentation](https://opentelemetry.io/docs/) - [React Error Boundary](https://reactjs.org/docs/error-boundaries.html) ## 📦 Instalasi ```bash yarn add @echoteam/signoz-react npm install @echoteam/signoz-react ``` ## 🔧 Konfigurasi ### Environment Variables Tambahkan environment variables berikut ke file `.env`: ```env REACT_APP_SIGNOZ_SERVICE_NAME=my-react-app REACT_APP_SIGNOZ_SERVICE_VERSION=1.0.0 REACT_APP_SIGNOZ_ENV=production REACT_APP_SIGNOZ_SERVICE_NAMESPACE=frontend REACT_APP_SIGNOZ_URL=https://your-signoz-instance.com/v1/traces REACT_APP_SIGNOZ_TRACE_SAMPLE_RATE=1.0 REACT_APP_SIGNOZ_ALLOWED_ORIGINS=https://api1.example.com,https://api2.example.com,/^https:\/\/.*\.your-domain\.com$/ ``` > **Catatan untuk REACT_APP_SIGNOZ_ALLOWED_ORIGINS:** > - Daftar URL yang diizinkan untuk CORS, dipisahkan dengan koma > - Untuk RegExp pattern, gunakan format `/pattern/` (contoh: `/^https:\/\/.*\.example\.com$/`) > - Jika tidak diisi, default ke semua origin (`/.+/g`) > - Spasi di sekitar koma akan dihapus otomatis ### Inisialisasi ```typescript import { initializeSignOzTracing } from '@echoteam/signoz-react'; // Inisialisasi dengan environment variables initializeSignOzTracing(); // Atau dengan konfigurasi manual // Inisialisasi dengan konfigurasi minimal initializeSignOzTracing({ serviceName: 'my-app', serviceVersion: '1.0.0', environment: 'production', serviceNamespace: 'default', url: 'https://api.signoz.io/v1/traces' }); // Inisialisasi dengan konfigurasi lengkap initializeSignOzTracing({ serviceName: 'my-app', serviceVersion: '1.0.0', environment: 'production', serviceNamespace: 'default', url: 'https://api.signoz.io/v1/traces', headers: { 'X-API-Key': 'your-api-key' }, traceSampleRate: 0.5, // Sampling 50% trace batchSpanProcessorConfig: { maxQueueSize: 100, scheduledDelayMillis: 5000, exportTimeoutMillis: 30000 }, allowedOrigins: [ 'https://api.example.com', /^https:\/\/.*\.your-domain\.com$/ ] }); ``` ## 🎯 Penggunaan ### Error Boundary #### Penggunaan Dasar ```tsx import { ErrorBoundary } from '@echoteam/signoz-react'; function App() { return ( <ErrorBoundary> <YourApp /> </ErrorBoundary> ); } ``` #### Error Boundary dengan Kustomisasi ```tsx import { ErrorBoundary, ErrorBoundaryProps } from '@echoteam/signoz-react'; // Custom fallback component const CustomErrorFallback: React.FC<{ error: Error; resetErrorBoundary: () => void }> = ({ error, resetErrorBoundary }) => ( <div className="custom-error"> <h2>Terjadi Kesalahan!</h2> <p>{error.message}</p> <button onClick={resetErrorBoundary}>Coba Lagi</button> </div> ); function App() { const handleError = (error: Error, errorInfo: React.ErrorInfo) => { console.log('Error caught:', error); // Kirim ke service lain jika diperlukan }; return ( <ErrorBoundary fallback={CustomErrorFallback} onError={handleError} onReset={() => console.log('Error boundary reset')} fallbackClassName="my-error-boundary" > <YourApp /> </ErrorBoundary> ); } ``` ### Error Page untuk React Router #### Penggunaan Dasar ```tsx import { ErrorPage } from '@echoteam/signoz-react'; import { createBrowserRouter } from 'react-router-dom'; const router = createBrowserRouter([ { path: "/", element: <Root />, errorElement: <ErrorPage />, }, ]); ``` #### Error Page dengan Kustomisasi ```tsx import { ErrorPage, ErrorPageProps } from '@echoteam/signoz-react'; // Custom error page const CustomErrorPage: React.FC<ErrorPageProps> = (props) => ( <ErrorPage title="Halaman Tidak Ditemukan" message="Maaf, halaman yang Anda cari tidak tersedia." showStackTrace={process.env.NODE_ENV === 'development'} actionButton={ <button onClick={() => window.history.back()}> Kembali ke Halaman Sebelumnya </button> } className="custom-error-page" /> ); // Atau dengan custom render function const CustomErrorPageWithRender: React.FC<ErrorPageProps> = () => ( <ErrorPage renderError={(error) => ( <div className="my-custom-error"> <h1>🚨 Error!</h1> <p>Kode Error: {error.name}</p> <p>Pesan: {error.message}</p> <button onClick={() => window.location.href = '/'}> Kembali ke Beranda </button> </div> )} /> ); const router = createBrowserRouter([ { path: "/", element: <Root />, errorElement: <CustomErrorPage />, }, ]); ``` ### Tracing Manual ```typescript import { trace } from '@opentelemetry/api'; const tracer = trace.getTracer('my-service'); const span = tracer.startSpan('my-operation'); try { // Lakukan operasi span.setAttribute('operation.type', 'database-query'); span.setAttribute('operation.result', 'success'); } catch (error) { span.recordException(error); span.setStatus({ code: SpanStatusCode.ERROR, message: error.message }); } finally { span.end(); } ``` ## 📋 API Reference ### `initializeSignOzTracing(config?)` Inisialisasi SignOz tracing untuk aplikasi React. **Parameter:** - `config` (opsional): Konfigurasi SignOz - `serviceName`: Nama layanan - `serviceVersion`: Versi layanan - `environment`: Environment (production, staging, development) - `serviceNamespace`: Namespace layanan - `url`: URL endpoint SignOz - `headers` (opsional): Header tambahan untuk request - `traceSampleRate` (opsional): Rate sampling trace (0-1, default: 1.0) - `batchSpanProcessorConfig` (opsional): Konfigurasi batch processor - `maxQueueSize`: Ukuran maksimum antrian span - `scheduledDelayMillis`: Delay pengiriman batch dalam milidetik - `exportTimeoutMillis`: Timeout ekspor dalam milidetik - `allowedOrigins` (opsional): Array URL/RegExp yang diizinkan untuk CORS ### `ErrorBoundary` Komponen React untuk menangkap error dan melaporkan ke SignOz. **Props:** - `children`: React children - `fallback`: Custom fallback component - `onError`: Custom error handler function - `onReset`: Custom reset handler - `showResetButton`: Apakah menampilkan reset button (default: true) - `resetButtonText`: Custom reset button text - `fallbackClassName`: Custom CSS class untuk fallback ### `ErrorPage` Komponen halaman error untuk React Router. **Props:** - `title`: Judul halaman error (default: "Oops!") - `message`: Pesan error utama (default: "Terjadi kesalahan yang tidak terduga.") - `renderError`: Custom render function untuk menampilkan error - `className`: Custom CSS class untuk container - `showStackTrace`: Apakah menampilkan stack trace (default: false) - `actionButton`: Custom action button ## 🔍 Monitoring Setelah setup, Anda dapat melihat traces di dashboard SignOz: 1. **Service Overview**: Melihat performa layanan secara keseluruhan 2. **Traces**: Melihat detail traces untuk setiap request 3. **Errors**: Melihat error yang terjadi dengan stack trace 4. **Metrics**: Melihat metrics performa aplikasi ## 🚨 Troubleshooting ### Error: Can't resolve 'perf_hooks' Jika Anda mendapatkan error seperti ini: ``` ERROR in ./node_modules/@echoteam/signoz-react/dist/index.esm.js 1:0-58 Module not found: Error: Can't resolve 'perf_hooks' in '/path/to/node_modules/@echoteam/signoz-react/dist' ``` **Solusi:** Library ini sudah diperbaiki untuk menangani masalah ini. Pastikan Anda menggunakan versi terbaru: ```bash yarn add @echoteam/signoz-react@latest ``` Jika masih mengalami masalah, lihat [TROUBLESHOOTING.md](TROUBLESHOOTING.md) untuk solusi lengkap berdasarkan bundler yang Anda gunakan (Webpack, Vite, Create React App). ### Masalah Umum Lainnya 1. **Environment Variables Tidak Terdeteksi**: Pastikan semua environment variables sudah dikonfigurasi dengan benar 2. **CORS Error**: Pastikan URL SignOz dapat diakses dari domain aplikasi Anda 3. **Network Error**: Periksa koneksi internet dan firewall settings Untuk informasi troubleshooting lebih lengkap, lihat [TROUBLESHOOTING.md](TROUBLESHOOTING.md). ## 🛠️ Development ### Setup Development ```bash # Clone repository git clone https://gitlab.echoteam.tech/codr/package/signoz-react-js.git cd signoz-react-js # Install dependencies yarn install # Build package yarn build # Development mode yarn dev ``` ### Scripts - `yarn build`: Build package untuk production - `yarn dev`: Build dalam mode development dengan watch - `yarn test`: Jalankan tests - `yarn lint`: Lint kode - `yarn format`: Format kode dengan Prettier ## 📄 License MIT License - lihat file [LICENSE](LICENSE) untuk detail. ## 🤝 Contributing 1. Fork repository 2. Buat feature branch (`git checkout -b feature/amazing-feature`) 3. Commit perubahan (`git commit -m 'Add amazing feature'`) 4. Push ke branch (`git push origin feature/amazing-feature`) 5. Buat Pull Request ## 📞 Support - **Issues**: [GitLab Issues](https://gitlab.echoteam.tech/codr/package/signoz-react-js/-/issues) - **Email**: dev@codr.id - **Documentation**: [GitLab Wiki](https://gitlab.echoteam.tech/codr/package/signoz-react-js/-/wikis) ## 🔗 Links - [SignOz Documentation](https://signoz.io/docs/) - [OpenTelemetry Documentation](https://opentelemetry.io/docs/) - [React Error Boundary](https://reactjs.org/docs/error-boundaries.html)