mirror of
https://git.mirrors.martin98.com/https://github.com/SigNoz/signoz
synced 2025-08-13 23:15:57 +08:00
Onboarding v2 (#3955)
* feat: onboarding v2 * feat: module steps container component * feat: use onboarding context * feat: restructure folders for onboarding * feat: update data source utils and handle form value changes * feat: fix tsx issues * feat: remove stale code * feat: handle validate data source step and other ui fixes * feat: conditionally render steps inside modules * feat: update onboarding for ror * feat: refactoring * feat: generate file path to fetch md doc * feat: delete old module component files and move analytics utils to custom hook * feat: handle environment not selected state * feat: docs file structure for onboarding (#3975) * feat: replace analytics util with hooks * feat: delete apm flask kubernetes files and reference * feat: update analytics events * Onboarding docs v2 (#3988) * feat: added content to markdown files * feat: separate filepath constants for apm, logs , infra * feat: map key and filepath for logs * feat: mapped inframonitoring file paths * feat: minor updates * feat: remove console.log --------- Co-authored-by: Calm-Rock <Chitgupta24@gmail.com> * feat: ignore file path fetch error --------- Co-authored-by: Calm-Rock <Chitgupta24@gmail.com>
This commit is contained in:
parent
d091d90d66
commit
bad69abcc2
BIN
frontend/public/Logos/fluent-bit.png
Normal file
BIN
frontend/public/Logos/fluent-bit.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 48 KiB |
BIN
frontend/public/Logos/fluentd.png
Normal file
BIN
frontend/public/Logos/fluentd.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 20 KiB |
1
frontend/public/Logos/logstash.svg
Normal file
1
frontend/public/Logos/logstash.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<svg id="Layer_1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 80 80" width="2500" height="2500"><style>.st0{fill:#f3bd19}.st1{fill:#231f20}.st2{fill:#3ebeb0}.st3{fill:#37a595}.st4{fill:none}</style><path class="st0" d="M41.1 41.9H15.6V12.5h7.7c9.9 0 17.8 8 17.8 17.8v11.6z"/><path class="st1" d="M41.1 67.5c-14.1 0-25.6-11.4-25.6-25.6h25.6v25.6z"/><path class="st2" d="M41.1 41.9h23.3v25.6H41.1z"/><path class="st3" d="M41.1 41.9h5.4v25.6h-5.4z"/><path class="st4" d="M0 0h80v80H0z"/></svg>
|
After Width: | Height: | Size: 494 B |
@ -7,6 +7,7 @@ import { FeatureKeys } from 'constants/features';
|
|||||||
import { LOCALSTORAGE } from 'constants/localStorage';
|
import { LOCALSTORAGE } from 'constants/localStorage';
|
||||||
import ROUTES from 'constants/routes';
|
import ROUTES from 'constants/routes';
|
||||||
import AppLayout from 'container/AppLayout';
|
import AppLayout from 'container/AppLayout';
|
||||||
|
import useAnalytics from 'hooks/analytics/useAnalytics';
|
||||||
import { useThemeConfig } from 'hooks/useDarkMode';
|
import { useThemeConfig } from 'hooks/useDarkMode';
|
||||||
import useGetFeatureFlag from 'hooks/useGetFeatureFlag';
|
import useGetFeatureFlag from 'hooks/useGetFeatureFlag';
|
||||||
import useLicense, { LICENSE_PLAN_KEY } from 'hooks/useLicense';
|
import useLicense, { LICENSE_PLAN_KEY } from 'hooks/useLicense';
|
||||||
@ -25,7 +26,6 @@ import AppActions from 'types/actions';
|
|||||||
import { UPDATE_FEATURE_FLAG_RESPONSE } from 'types/actions/app';
|
import { UPDATE_FEATURE_FLAG_RESPONSE } from 'types/actions/app';
|
||||||
import AppReducer, { User } from 'types/reducer/app';
|
import AppReducer, { User } from 'types/reducer/app';
|
||||||
import { extractDomain, isCloudUser, isEECloudUser } from 'utils/app';
|
import { extractDomain, isCloudUser, isEECloudUser } from 'utils/app';
|
||||||
import { trackPageView } from 'utils/segmentAnalytics';
|
|
||||||
|
|
||||||
import PrivateRoute from './Private';
|
import PrivateRoute from './Private';
|
||||||
import defaultRoutes, { AppRoutes, SUPPORT_ROUTE } from './routes';
|
import defaultRoutes, { AppRoutes, SUPPORT_ROUTE } from './routes';
|
||||||
@ -41,6 +41,8 @@ function App(): JSX.Element {
|
|||||||
|
|
||||||
const dispatch = useDispatch<Dispatch<AppActions>>();
|
const dispatch = useDispatch<Dispatch<AppActions>>();
|
||||||
|
|
||||||
|
const { trackPageView } = useAnalytics();
|
||||||
|
|
||||||
const { hostname, pathname } = window.location;
|
const { hostname, pathname } = window.location;
|
||||||
|
|
||||||
const isCloudUserVal = isCloudUser();
|
const isCloudUserVal = isCloudUser();
|
||||||
@ -156,6 +158,7 @@ function App(): JSX.Element {
|
|||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
trackPageView(pathname);
|
trackPageView(pathname);
|
||||||
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
||||||
}, [pathname]);
|
}, [pathname]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
.code-snippet-container {
|
.code-snippet-container {
|
||||||
position: relative;
|
position: relative;
|
||||||
background-color: rgb(43, 43, 43);
|
// background-color: rgb(43, 43, 43);
|
||||||
|
background-color: #111a2c;
|
||||||
|
border-color: #111a2c;
|
||||||
}
|
}
|
||||||
|
|
||||||
.code-copy-btn {
|
.code-copy-btn {
|
||||||
|
@ -5,7 +5,7 @@ export const Layout = styled(LayoutComponent)`
|
|||||||
&&& {
|
&&& {
|
||||||
display: flex;
|
display: flex;
|
||||||
position: relative;
|
position: relative;
|
||||||
min-height: calc(100vh - 4rem);
|
min-height: calc(100vh - 8rem);
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
}
|
}
|
||||||
|
@ -9,6 +9,7 @@ import getUsage from 'api/billing/getUsage';
|
|||||||
import manageCreditCardApi from 'api/billing/manage';
|
import manageCreditCardApi from 'api/billing/manage';
|
||||||
import { SOMETHING_WENT_WRONG } from 'constants/api';
|
import { SOMETHING_WENT_WRONG } from 'constants/api';
|
||||||
import { REACT_QUERY_KEY } from 'constants/reactQueryKeys';
|
import { REACT_QUERY_KEY } from 'constants/reactQueryKeys';
|
||||||
|
import useAnalytics from 'hooks/analytics/useAnalytics';
|
||||||
import useAxiosError from 'hooks/useAxiosError';
|
import useAxiosError from 'hooks/useAxiosError';
|
||||||
import useLicense from 'hooks/useLicense';
|
import useLicense from 'hooks/useLicense';
|
||||||
import { useNotifications } from 'hooks/useNotifications';
|
import { useNotifications } from 'hooks/useNotifications';
|
||||||
@ -109,9 +110,11 @@ export default function BillingContainer(): JSX.Element {
|
|||||||
const [data, setData] = useState<any[]>([]);
|
const [data, setData] = useState<any[]>([]);
|
||||||
const billCurrency = '$';
|
const billCurrency = '$';
|
||||||
|
|
||||||
|
const { trackEvent } = useAnalytics();
|
||||||
|
|
||||||
const { isFetching, data: licensesData, error: licenseError } = useLicense();
|
const { isFetching, data: licensesData, error: licenseError } = useLicense();
|
||||||
|
|
||||||
const { user } = useSelector<AppState, AppReducer>((state) => state.app);
|
const { user, org } = useSelector<AppState, AppReducer>((state) => state.app);
|
||||||
const { notifications } = useNotifications();
|
const { notifications } = useNotifications();
|
||||||
|
|
||||||
const handleError = useAxiosError();
|
const handleError = useAxiosError();
|
||||||
@ -301,18 +304,29 @@ export default function BillingContainer(): JSX.Element {
|
|||||||
|
|
||||||
const handleBilling = useCallback(async () => {
|
const handleBilling = useCallback(async () => {
|
||||||
if (isFreeTrial && !licensesData?.payload?.trialConvertedToSubscription) {
|
if (isFreeTrial && !licensesData?.payload?.trialConvertedToSubscription) {
|
||||||
|
trackEvent('Billing : Upgrade Plan', {
|
||||||
|
user,
|
||||||
|
org,
|
||||||
|
});
|
||||||
|
|
||||||
updateCreditCard({
|
updateCreditCard({
|
||||||
licenseKey: activeLicense?.key || '',
|
licenseKey: activeLicense?.key || '',
|
||||||
successURL: window.location.href,
|
successURL: window.location.href,
|
||||||
cancelURL: window.location.href,
|
cancelURL: window.location.href,
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
|
trackEvent('Billing : Manage Billing', {
|
||||||
|
user,
|
||||||
|
org,
|
||||||
|
});
|
||||||
|
|
||||||
manageCreditCard({
|
manageCreditCard({
|
||||||
licenseKey: activeLicense?.key || '',
|
licenseKey: activeLicense?.key || '',
|
||||||
successURL: window.location.href,
|
successURL: window.location.href,
|
||||||
cancelURL: window.location.href,
|
cancelURL: window.location.href,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
||||||
}, [
|
}, [
|
||||||
activeLicense?.key,
|
activeLicense?.key,
|
||||||
isFreeTrial,
|
isFreeTrial,
|
||||||
@ -432,7 +446,12 @@ export default function BillingContainer(): JSX.Element {
|
|||||||
</Typography.Text>
|
</Typography.Text>
|
||||||
</Col>
|
</Col>
|
||||||
<Col span={4} style={{ display: 'flex', justifyContent: 'flex-end' }}>
|
<Col span={4} style={{ display: 'flex', justifyContent: 'flex-end' }}>
|
||||||
<Button type="primary" size="middle">
|
<Button
|
||||||
|
type="primary"
|
||||||
|
size="middle"
|
||||||
|
loading={isLoadingBilling || isLoadingManageBilling}
|
||||||
|
onClick={handleBilling}
|
||||||
|
>
|
||||||
Upgrade Plan
|
Upgrade Plan
|
||||||
</Button>
|
</Button>
|
||||||
</Col>
|
</Col>
|
||||||
|
@ -135,14 +135,13 @@ function HeaderContainer(): JSX.Element {
|
|||||||
<>
|
<>
|
||||||
{showTrialExpiryBanner && (
|
{showTrialExpiryBanner && (
|
||||||
<div className="trial-expiry-banner">
|
<div className="trial-expiry-banner">
|
||||||
You are in free trial period. Your free trial will end on{' '}
|
You are in free trial period. Your free trial will end on
|
||||||
<span>
|
<span>
|
||||||
{getFormattedDate(licenseData?.payload?.trialEnd || Date.now())}.
|
{getFormattedDate(licenseData?.payload?.trialEnd || Date.now())}.
|
||||||
</span>
|
</span>
|
||||||
{role === 'ADMIN' ? (
|
{role === 'ADMIN' ? (
|
||||||
<span>
|
<span>
|
||||||
{' '}
|
Please
|
||||||
Please{' '}
|
|
||||||
<Button className="upgrade-link" type="link" onClick={handleUpgrade}>
|
<Button className="upgrade-link" type="link" onClick={handleUpgrade}>
|
||||||
upgrade
|
upgrade
|
||||||
</Button>
|
</Button>
|
||||||
|
@ -1,144 +0,0 @@
|
|||||||
.apm-module-container {
|
|
||||||
padding: 48px 0;
|
|
||||||
|
|
||||||
.header {
|
|
||||||
h1 {
|
|
||||||
font-size: 24px;
|
|
||||||
font-weight: 500;
|
|
||||||
}
|
|
||||||
|
|
||||||
h4 {
|
|
||||||
font-size: 14px;
|
|
||||||
font-weight: 300;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.supported-languages-container {
|
|
||||||
display: flex;
|
|
||||||
gap: 24px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.supported-language {
|
|
||||||
display: flex;
|
|
||||||
justify-content: center;
|
|
||||||
align-items: center;
|
|
||||||
width: 300px;
|
|
||||||
height: 120px;
|
|
||||||
background: #1d1d1d;
|
|
||||||
border: 1px solid #424242;
|
|
||||||
border-radius: 3px;
|
|
||||||
color: #424242;
|
|
||||||
cursor: pointer;
|
|
||||||
|
|
||||||
&.selected {
|
|
||||||
background-color: #111a2c;
|
|
||||||
border: 0.5px solid #3c89e8;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.supported-langauge-img {
|
|
||||||
height: 48px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.selected-langauage-setup-instructions {
|
|
||||||
padding: 24px 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
div[class*='-setup-instructions-container'] {
|
|
||||||
.header {
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
|
|
||||||
margin: 16px 0;
|
|
||||||
|
|
||||||
img {
|
|
||||||
height: 40px;
|
|
||||||
}
|
|
||||||
|
|
||||||
h1 {
|
|
||||||
font-size: 18px;
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
color: #e5e7eb;
|
|
||||||
gap: 16px;
|
|
||||||
margin: 12px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.label {
|
|
||||||
font-size: 14px;
|
|
||||||
margin-bottom: 8px;
|
|
||||||
font-weight: 300;
|
|
||||||
}
|
|
||||||
|
|
||||||
pre {
|
|
||||||
background-color: #292d3e;
|
|
||||||
padding: 8px;
|
|
||||||
overflow: auto;
|
|
||||||
border-radius: 3px;
|
|
||||||
|
|
||||||
code {
|
|
||||||
overflow: auto;
|
|
||||||
text-wrap: wrap;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.content-container {
|
|
||||||
padding: 24px;
|
|
||||||
margin: 16px 0;
|
|
||||||
background: rgba(29, 29, 29, 1);
|
|
||||||
line-height: 20px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.detailed-docs-link {
|
|
||||||
display: flex;
|
|
||||||
margin: 12px;
|
|
||||||
font-size: 12px;
|
|
||||||
|
|
||||||
a {
|
|
||||||
padding-left: 4px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.form-container {
|
|
||||||
display: flex;
|
|
||||||
align-items: flex-start;
|
|
||||||
width: 100%;
|
|
||||||
gap: 16px;
|
|
||||||
|
|
||||||
& .ant-form-item {
|
|
||||||
margin-bottom: 0px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$lightModeFontColor: rgb(29, 29, 29);
|
|
||||||
|
|
||||||
.lightMode {
|
|
||||||
.apm-module-container {
|
|
||||||
.header {
|
|
||||||
color: $lightModeFontColor;
|
|
||||||
}
|
|
||||||
|
|
||||||
div[class*='-setup-instructions-container'] {
|
|
||||||
.header {
|
|
||||||
h1 {
|
|
||||||
color: $lightModeFontColor;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.framework-selector {
|
|
||||||
.label {
|
|
||||||
color: $lightModeFontColor;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.service-name-container {
|
|
||||||
.label {
|
|
||||||
color: $lightModeFontColor;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,147 +0,0 @@
|
|||||||
/* eslint-disable jsx-a11y/click-events-have-key-events */
|
|
||||||
/* eslint-disable jsx-a11y/no-static-element-interactions */
|
|
||||||
import './APM.styles.scss';
|
|
||||||
|
|
||||||
import getIngestionData from 'api/settings/getIngestionData';
|
|
||||||
import cx from 'classnames';
|
|
||||||
import { useEffect, useState } from 'react';
|
|
||||||
import { useQuery } from 'react-query';
|
|
||||||
import { trackEvent } from 'utils/segmentAnalytics';
|
|
||||||
|
|
||||||
import GoLang from './GoLang/GoLang';
|
|
||||||
import Java from './Java/Java';
|
|
||||||
import Javascript from './Javascript/Javascript';
|
|
||||||
import Python from './Python/Python';
|
|
||||||
import RoR from './RubyOnRails/ROR';
|
|
||||||
|
|
||||||
interface IngestionInfoProps {
|
|
||||||
SIGNOZ_INGESTION_KEY?: string;
|
|
||||||
REGION?: string;
|
|
||||||
}
|
|
||||||
export interface LangProps {
|
|
||||||
ingestionInfo: IngestionInfoProps;
|
|
||||||
activeStep: number;
|
|
||||||
}
|
|
||||||
|
|
||||||
const supportedLanguages = [
|
|
||||||
{
|
|
||||||
name: 'java',
|
|
||||||
imgURL: `Logos/java.png`,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'python',
|
|
||||||
imgURL: `Logos/java.png`,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'javascript',
|
|
||||||
imgURL: `Logos/java.png`,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'go',
|
|
||||||
imgURL: `Logos/java.png`,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'rails',
|
|
||||||
imgURL: `Logos/rails.png`,
|
|
||||||
},
|
|
||||||
];
|
|
||||||
|
|
||||||
export default function APM({
|
|
||||||
activeStep,
|
|
||||||
}: {
|
|
||||||
activeStep: number;
|
|
||||||
}): JSX.Element {
|
|
||||||
const [selectedLanguage, setSelectedLanguage] = useState('java');
|
|
||||||
|
|
||||||
const [ingestionInfo, setIngestionInfo] = useState<IngestionInfoProps>({});
|
|
||||||
|
|
||||||
const { status, data: ingestionData } = useQuery({
|
|
||||||
queryFn: () => getIngestionData(),
|
|
||||||
});
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
if (
|
|
||||||
status === 'success' &&
|
|
||||||
ingestionData.payload &&
|
|
||||||
Array.isArray(ingestionData.payload)
|
|
||||||
) {
|
|
||||||
const payload = ingestionData.payload[0] || {
|
|
||||||
ingestionKey: '',
|
|
||||||
dataRegion: '',
|
|
||||||
};
|
|
||||||
|
|
||||||
setIngestionInfo({
|
|
||||||
SIGNOZ_INGESTION_KEY: payload?.ingestionKey,
|
|
||||||
REGION: payload?.dataRegion,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}, [status, ingestionData?.payload]);
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
// on language select
|
|
||||||
trackEvent('Onboarding: APM', {
|
|
||||||
selectedLanguage,
|
|
||||||
activeStep,
|
|
||||||
});
|
|
||||||
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
||||||
}, [selectedLanguage]);
|
|
||||||
|
|
||||||
const renderSelectedLanguageSetupInstructions = (): JSX.Element => {
|
|
||||||
switch (selectedLanguage) {
|
|
||||||
case 'java':
|
|
||||||
return <Java ingestionInfo={ingestionInfo} activeStep={activeStep} />;
|
|
||||||
case 'python':
|
|
||||||
return <Python ingestionInfo={ingestionInfo} activeStep={activeStep} />;
|
|
||||||
case 'javascript':
|
|
||||||
return <Javascript ingestionInfo={ingestionInfo} activeStep={activeStep} />;
|
|
||||||
case 'go':
|
|
||||||
return <GoLang ingestionInfo={ingestionInfo} activeStep={activeStep} />;
|
|
||||||
case 'rails':
|
|
||||||
return <RoR ingestionInfo={ingestionInfo} activeStep={activeStep} />;
|
|
||||||
default:
|
|
||||||
return <> </>;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
return (
|
|
||||||
<div className="apm-module-container">
|
|
||||||
{activeStep === 2 && (
|
|
||||||
<>
|
|
||||||
<div className="header">
|
|
||||||
<h1>
|
|
||||||
Get Started to instrument your applications and sending data to SigNoz
|
|
||||||
</h1>
|
|
||||||
<h4> Select the data source </h4>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div className="supported-languages-container">
|
|
||||||
{supportedLanguages.map((supportedLanguage) => (
|
|
||||||
<div
|
|
||||||
className={cx(
|
|
||||||
'supported-language',
|
|
||||||
selectedLanguage === supportedLanguage.name ? 'selected' : '',
|
|
||||||
)}
|
|
||||||
key={supportedLanguage.name}
|
|
||||||
onClick={(): void => setSelectedLanguage(supportedLanguage.name)}
|
|
||||||
>
|
|
||||||
<img
|
|
||||||
className={cx('supported-langauge-img')}
|
|
||||||
src={`/Logos/${supportedLanguage.name}.png`}
|
|
||||||
alt=""
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
))}
|
|
||||||
</div>
|
|
||||||
</>
|
|
||||||
)}
|
|
||||||
|
|
||||||
{selectedLanguage && (
|
|
||||||
<div
|
|
||||||
className={cx('selected-langauage-setup-instructions', selectedLanguage)}
|
|
||||||
>
|
|
||||||
{renderSelectedLanguageSetupInstructions()}
|
|
||||||
</div>
|
|
||||||
)}
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
}
|
|
@ -1,68 +0,0 @@
|
|||||||
import './GoLang.styles.scss';
|
|
||||||
|
|
||||||
import { Form, Input } from 'antd';
|
|
||||||
import { MarkdownRenderer } from 'components/MarkdownRenderer/MarkdownRenderer';
|
|
||||||
import Header from 'container/OnboardingContainer/common/Header/Header';
|
|
||||||
|
|
||||||
import { LangProps } from '../APM';
|
|
||||||
import ConnectionStatus from '../common/ConnectionStatus/ConnectionStatus';
|
|
||||||
import GoLangDocs from './goLang.md';
|
|
||||||
|
|
||||||
export default function GoLang({
|
|
||||||
ingestionInfo,
|
|
||||||
activeStep,
|
|
||||||
}: LangProps): JSX.Element {
|
|
||||||
const [form] = Form.useForm();
|
|
||||||
const serviceName = Form.useWatch('Service Name', form);
|
|
||||||
|
|
||||||
const variables = {
|
|
||||||
MYAPP: serviceName || '<service-name>',
|
|
||||||
SIGNOZ_INGESTION_KEY:
|
|
||||||
ingestionInfo.SIGNOZ_INGESTION_KEY || '<SIGNOZ_INGESTION_KEY>',
|
|
||||||
REGION: ingestionInfo.REGION || 'region',
|
|
||||||
};
|
|
||||||
|
|
||||||
return (
|
|
||||||
<>
|
|
||||||
{activeStep === 2 && (
|
|
||||||
<div className="golang-setup-instructions-container">
|
|
||||||
<Header
|
|
||||||
entity="go"
|
|
||||||
heading="Go OpenTelemetry Instrumentation"
|
|
||||||
imgURL="/Logos/go.png"
|
|
||||||
docsURL="https://signoz.io/docs/instrumentation/golang/"
|
|
||||||
imgClassName="supported-language-img"
|
|
||||||
/>
|
|
||||||
|
|
||||||
<div className="form-container">
|
|
||||||
<div className="service-name-container">
|
|
||||||
<div className="label"> Service Name </div>
|
|
||||||
|
|
||||||
<Form form={form} name="service-name" style={{ minWidth: '300px' }}>
|
|
||||||
<Form.Item
|
|
||||||
hasFeedback
|
|
||||||
name="Service Name"
|
|
||||||
rules={[{ required: true }]}
|
|
||||||
validateTrigger="onBlur"
|
|
||||||
>
|
|
||||||
<Input autoFocus />
|
|
||||||
</Form.Item>
|
|
||||||
</Form>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div className="content-container">
|
|
||||||
<MarkdownRenderer markdownContent={GoLangDocs} variables={variables} />
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
)}
|
|
||||||
{activeStep === 3 && (
|
|
||||||
<ConnectionStatus
|
|
||||||
serviceName={form.getFieldValue('Service Name')}
|
|
||||||
framework="go"
|
|
||||||
language="go"
|
|
||||||
/>
|
|
||||||
)}
|
|
||||||
</>
|
|
||||||
);
|
|
||||||
}
|
|
@ -1,10 +0,0 @@
|
|||||||
.form-container {
|
|
||||||
display: flex;
|
|
||||||
align-items: flex-start;
|
|
||||||
width: 100%;
|
|
||||||
gap: 16px;
|
|
||||||
|
|
||||||
& .ant-form-item {
|
|
||||||
margin-bottom: 0px;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,146 +0,0 @@
|
|||||||
import './Java.styles.scss';
|
|
||||||
|
|
||||||
import { Form, Input, Select } from 'antd';
|
|
||||||
import { MarkdownRenderer } from 'components/MarkdownRenderer/MarkdownRenderer';
|
|
||||||
import Header from 'container/OnboardingContainer/common/Header/Header';
|
|
||||||
import { useEffect, useState } from 'react';
|
|
||||||
import { trackEvent } from 'utils/segmentAnalytics';
|
|
||||||
import { popupContainer } from 'utils/selectPopupContainer';
|
|
||||||
|
|
||||||
import { LangProps } from '../APM';
|
|
||||||
import ConnectionStatus from '../common/ConnectionStatus/ConnectionStatus';
|
|
||||||
import JavaDocs from './md-docs/java.md';
|
|
||||||
import JbossDocs from './md-docs/jboss.md';
|
|
||||||
import SprintBootDocs from './md-docs/spring_boot.md';
|
|
||||||
import TomcatDocs from './md-docs/tomcat.md';
|
|
||||||
|
|
||||||
enum FrameworksMap {
|
|
||||||
tomcat = 'Tomcat',
|
|
||||||
spring_boot = 'Spring Boot',
|
|
||||||
jboss = 'JBoss',
|
|
||||||
other = 'Others',
|
|
||||||
}
|
|
||||||
|
|
||||||
export default function Java({
|
|
||||||
ingestionInfo,
|
|
||||||
activeStep,
|
|
||||||
}: LangProps): JSX.Element {
|
|
||||||
const [selectedFrameWork, setSelectedFrameWork] = useState('spring_boot');
|
|
||||||
const [selectedFrameWorkDocs, setSelectedFrameWorkDocs] = useState(
|
|
||||||
SprintBootDocs,
|
|
||||||
);
|
|
||||||
|
|
||||||
const [form] = Form.useForm();
|
|
||||||
const serviceName = Form.useWatch('Service Name', form);
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
// on language select
|
|
||||||
trackEvent('Onboarding: APM : Java', {
|
|
||||||
selectedFrameWork,
|
|
||||||
});
|
|
||||||
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
||||||
}, [selectedFrameWork]);
|
|
||||||
|
|
||||||
const handleFrameworkChange = (selectedFrameWork: string): void => {
|
|
||||||
setSelectedFrameWork(selectedFrameWork);
|
|
||||||
|
|
||||||
switch (selectedFrameWork) {
|
|
||||||
case 'tomcat':
|
|
||||||
setSelectedFrameWorkDocs(TomcatDocs);
|
|
||||||
break;
|
|
||||||
case 'spring_boot':
|
|
||||||
setSelectedFrameWorkDocs(SprintBootDocs);
|
|
||||||
break;
|
|
||||||
case 'jboss':
|
|
||||||
setSelectedFrameWorkDocs(JbossDocs);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
setSelectedFrameWorkDocs(JavaDocs);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
const variables = {
|
|
||||||
MYAPP: serviceName || '<service-name>',
|
|
||||||
SIGNOZ_INGESTION_KEY:
|
|
||||||
ingestionInfo.SIGNOZ_INGESTION_KEY || '<SIGNOZ_INGESTION_KEY>',
|
|
||||||
REGION: ingestionInfo.REGION || 'region',
|
|
||||||
};
|
|
||||||
|
|
||||||
return (
|
|
||||||
<>
|
|
||||||
{activeStep === 2 && (
|
|
||||||
<div className="java-setup-instructions-container">
|
|
||||||
<Header
|
|
||||||
entity="java"
|
|
||||||
heading="Java OpenTelemetry Instrumentation"
|
|
||||||
imgURL="/Logos/java.png"
|
|
||||||
docsURL="https://signoz.io/docs/instrumentation/java/"
|
|
||||||
imgClassName="supported-language-img"
|
|
||||||
/>
|
|
||||||
|
|
||||||
<div className="form-container">
|
|
||||||
<div className="framework-selector">
|
|
||||||
<div className="label"> Select Framework </div>
|
|
||||||
|
|
||||||
<Select
|
|
||||||
getPopupContainer={popupContainer}
|
|
||||||
defaultValue="spring_boot"
|
|
||||||
style={{ minWidth: 120 }}
|
|
||||||
placeholder="Select Framework"
|
|
||||||
onChange={(value): void => handleFrameworkChange(value)}
|
|
||||||
options={[
|
|
||||||
{
|
|
||||||
value: 'spring_boot',
|
|
||||||
label: FrameworksMap.spring_boot,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
value: 'tomcat',
|
|
||||||
label: FrameworksMap.tomcat,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
value: 'jboss',
|
|
||||||
label: FrameworksMap.jboss,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
value: 'other',
|
|
||||||
label: FrameworksMap.other,
|
|
||||||
},
|
|
||||||
]}
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div className="service-name-container">
|
|
||||||
<div className="label"> Service Name </div>
|
|
||||||
|
|
||||||
<Form form={form} name="service-name" style={{ minWidth: '300px' }}>
|
|
||||||
<Form.Item
|
|
||||||
hasFeedback
|
|
||||||
name="Service Name"
|
|
||||||
rules={[{ required: true }]}
|
|
||||||
validateTrigger="onBlur"
|
|
||||||
>
|
|
||||||
<Input autoFocus />
|
|
||||||
</Form.Item>
|
|
||||||
</Form>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div className="content-container">
|
|
||||||
<MarkdownRenderer
|
|
||||||
markdownContent={selectedFrameWorkDocs}
|
|
||||||
variables={variables}
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
)}
|
|
||||||
{activeStep === 3 && (
|
|
||||||
<ConnectionStatus
|
|
||||||
serviceName={form.getFieldValue('Service Name')}
|
|
||||||
language="java"
|
|
||||||
framework={(FrameworksMap as any)[selectedFrameWork]}
|
|
||||||
/>
|
|
||||||
)}
|
|
||||||
</>
|
|
||||||
);
|
|
||||||
}
|
|
@ -1,143 +0,0 @@
|
|||||||
import './Javascript.styles.scss';
|
|
||||||
|
|
||||||
import { Form, Input, Select } from 'antd';
|
|
||||||
import { MarkdownRenderer } from 'components/MarkdownRenderer/MarkdownRenderer';
|
|
||||||
import Header from 'container/OnboardingContainer/common/Header/Header';
|
|
||||||
import { useEffect, useState } from 'react';
|
|
||||||
import { trackEvent } from 'utils/segmentAnalytics';
|
|
||||||
import { popupContainer } from 'utils/selectPopupContainer';
|
|
||||||
|
|
||||||
import { LangProps } from '../APM';
|
|
||||||
import ConnectionStatus from '../common/ConnectionStatus/ConnectionStatus';
|
|
||||||
import ExpressDocs from './md-docs/express.md';
|
|
||||||
import JavascriptDocs from './md-docs/javascript.md';
|
|
||||||
import NestJsDocs from './md-docs/nestjs.md';
|
|
||||||
|
|
||||||
const frameworksMap = {
|
|
||||||
express: 'Express',
|
|
||||||
nestjs: 'Nest JS',
|
|
||||||
nodejs: 'Nodejs',
|
|
||||||
};
|
|
||||||
|
|
||||||
export default function Javascript({
|
|
||||||
ingestionInfo,
|
|
||||||
activeStep,
|
|
||||||
}: LangProps): JSX.Element {
|
|
||||||
const [selectedFrameWork, setSelectedFrameWork] = useState('express');
|
|
||||||
const [selectedFrameWorkDocs, setSelectedFrameWorkDocs] = useState(
|
|
||||||
ExpressDocs,
|
|
||||||
);
|
|
||||||
const [form] = Form.useForm();
|
|
||||||
const serviceName = Form.useWatch('Service Name', form);
|
|
||||||
|
|
||||||
const variables = {
|
|
||||||
MYAPP: serviceName || '<service-name>',
|
|
||||||
SIGNOZ_INGESTION_KEY:
|
|
||||||
ingestionInfo.SIGNOZ_INGESTION_KEY || '<SIGNOZ_INGESTION_KEY>',
|
|
||||||
REGION: ingestionInfo.REGION || 'region',
|
|
||||||
};
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
// on language select
|
|
||||||
trackEvent('Onboarding: APM : Javascript', {
|
|
||||||
selectedFrameWork,
|
|
||||||
});
|
|
||||||
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
||||||
}, [selectedFrameWork]);
|
|
||||||
|
|
||||||
const handleFrameworkChange = (selectedFrameWork: string): void => {
|
|
||||||
setSelectedFrameWork(selectedFrameWork);
|
|
||||||
|
|
||||||
switch (selectedFrameWork) {
|
|
||||||
case 'nodejs':
|
|
||||||
setSelectedFrameWorkDocs(JavascriptDocs);
|
|
||||||
break;
|
|
||||||
case 'nestjs':
|
|
||||||
setSelectedFrameWorkDocs(NestJsDocs);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
setSelectedFrameWorkDocs(ExpressDocs);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
return (
|
|
||||||
<>
|
|
||||||
{activeStep === 2 && (
|
|
||||||
<div className="javascript-setup-instructions-container">
|
|
||||||
<Header
|
|
||||||
entity="javascript"
|
|
||||||
heading="Javascript OpenTelemetry Instrumentation"
|
|
||||||
imgURL="/Logos/javascript.png"
|
|
||||||
docsURL="https://signoz.io/docs/instrumentation/javascript/"
|
|
||||||
imgClassName="supported-language-img"
|
|
||||||
/>
|
|
||||||
|
|
||||||
<div className="form-container">
|
|
||||||
<div className="framework-selector">
|
|
||||||
<div className="label"> Select Framework </div>
|
|
||||||
|
|
||||||
<Select
|
|
||||||
getPopupContainer={popupContainer}
|
|
||||||
defaultValue="express"
|
|
||||||
style={{ minWidth: 120 }}
|
|
||||||
placeholder="Select Framework"
|
|
||||||
onChange={(value): void => handleFrameworkChange(value)}
|
|
||||||
options={[
|
|
||||||
{
|
|
||||||
value: 'nodejs',
|
|
||||||
label: frameworksMap.nodejs,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
value: 'express',
|
|
||||||
label: frameworksMap.express,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
value: 'nestjs',
|
|
||||||
label: frameworksMap.nestjs,
|
|
||||||
},
|
|
||||||
]}
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div className="service-name-container">
|
|
||||||
<div className="label"> Service Name </div>
|
|
||||||
|
|
||||||
<Form
|
|
||||||
form={form}
|
|
||||||
name="service-name"
|
|
||||||
style={{ minWidth: '300px' }}
|
|
||||||
scrollToFirstError
|
|
||||||
requiredMark
|
|
||||||
>
|
|
||||||
<Form.Item
|
|
||||||
hasFeedback
|
|
||||||
name="Service Name"
|
|
||||||
rules={[{ required: true }]}
|
|
||||||
validateTrigger="onBlur"
|
|
||||||
required
|
|
||||||
>
|
|
||||||
<Input autoFocus />
|
|
||||||
</Form.Item>
|
|
||||||
</Form>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div className="content-container">
|
|
||||||
<MarkdownRenderer
|
|
||||||
markdownContent={selectedFrameWorkDocs}
|
|
||||||
variables={variables}
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
)}
|
|
||||||
{activeStep === 3 && (
|
|
||||||
<ConnectionStatus
|
|
||||||
serviceName={form.getFieldValue('Service Name')}
|
|
||||||
language="javascript"
|
|
||||||
framework={selectedFrameWork}
|
|
||||||
/>
|
|
||||||
)}
|
|
||||||
</>
|
|
||||||
);
|
|
||||||
}
|
|
@ -1,152 +0,0 @@
|
|||||||
import './Python.styles.scss';
|
|
||||||
|
|
||||||
import { Form, Input, Select } from 'antd';
|
|
||||||
import { MarkdownRenderer } from 'components/MarkdownRenderer/MarkdownRenderer';
|
|
||||||
import Header from 'container/OnboardingContainer/common/Header/Header';
|
|
||||||
import { useEffect, useState } from 'react';
|
|
||||||
import { trackEvent } from 'utils/segmentAnalytics';
|
|
||||||
import { popupContainer } from 'utils/selectPopupContainer';
|
|
||||||
|
|
||||||
import { LangProps } from '../APM';
|
|
||||||
import ConnectionStatus from '../common/ConnectionStatus/ConnectionStatus';
|
|
||||||
import DjangoDocs from './md-docs/django.md';
|
|
||||||
import FalconDocs from './md-docs/falcon.md';
|
|
||||||
import FastAPIDocs from './md-docs/fastAPI.md';
|
|
||||||
import FlaskDocs from './md-docs/flask.md';
|
|
||||||
import PythonDocs from './md-docs/python.md';
|
|
||||||
|
|
||||||
const frameworksMap = {
|
|
||||||
django: 'Django',
|
|
||||||
fastAPI: 'Fast API',
|
|
||||||
flask: 'Flask',
|
|
||||||
falcon: 'Falcon',
|
|
||||||
other: 'Others',
|
|
||||||
};
|
|
||||||
|
|
||||||
export default function Python({
|
|
||||||
ingestionInfo,
|
|
||||||
activeStep,
|
|
||||||
}: LangProps): JSX.Element {
|
|
||||||
const [selectedFrameWork, setSelectedFrameWork] = useState('django');
|
|
||||||
const [selectedFrameWorkDocs, setSelectedFrameWorkDocs] = useState(DjangoDocs);
|
|
||||||
const [form] = Form.useForm();
|
|
||||||
const serviceName = Form.useWatch('Service Name', form);
|
|
||||||
|
|
||||||
const variables = {
|
|
||||||
MYAPP: serviceName || '<service-name>',
|
|
||||||
SIGNOZ_INGESTION_KEY:
|
|
||||||
ingestionInfo.SIGNOZ_INGESTION_KEY || '<SIGNOZ_INGESTION_KEY>',
|
|
||||||
REGION: ingestionInfo.REGION || 'region',
|
|
||||||
};
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
// on language select
|
|
||||||
trackEvent('Onboarding: APM : Python', {
|
|
||||||
selectedFrameWork,
|
|
||||||
});
|
|
||||||
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
||||||
}, [selectedFrameWork]);
|
|
||||||
|
|
||||||
const handleFrameworkChange = (selectedFrameWork: string): void => {
|
|
||||||
setSelectedFrameWork(selectedFrameWork);
|
|
||||||
|
|
||||||
switch (selectedFrameWork) {
|
|
||||||
case 'django':
|
|
||||||
setSelectedFrameWorkDocs(DjangoDocs);
|
|
||||||
break;
|
|
||||||
case 'fastAPI':
|
|
||||||
setSelectedFrameWorkDocs(FastAPIDocs);
|
|
||||||
break;
|
|
||||||
case 'flask':
|
|
||||||
setSelectedFrameWorkDocs(FlaskDocs);
|
|
||||||
break;
|
|
||||||
case 'falcon':
|
|
||||||
setSelectedFrameWorkDocs(FalconDocs);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
setSelectedFrameWorkDocs(PythonDocs);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
return (
|
|
||||||
<>
|
|
||||||
{activeStep === 2 && (
|
|
||||||
<div className="python-setup-instructions-container">
|
|
||||||
<Header
|
|
||||||
entity="python"
|
|
||||||
heading="Python OpenTelemetry Instrumentation"
|
|
||||||
imgURL="/Logos/python.png"
|
|
||||||
docsURL="https://signoz.io/docs/instrumentation/python/"
|
|
||||||
imgClassName="supported-language-img"
|
|
||||||
/>
|
|
||||||
|
|
||||||
<div className="form-container">
|
|
||||||
<div className="framework-selector">
|
|
||||||
<div className="label"> Select Framework </div>
|
|
||||||
|
|
||||||
<Select
|
|
||||||
getPopupContainer={popupContainer}
|
|
||||||
defaultValue="Django"
|
|
||||||
style={{ minWidth: 120 }}
|
|
||||||
placeholder="Select Framework"
|
|
||||||
onChange={(value): void => handleFrameworkChange(value)}
|
|
||||||
options={[
|
|
||||||
{
|
|
||||||
value: 'django',
|
|
||||||
label: frameworksMap.django,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
value: 'fastAPI',
|
|
||||||
label: frameworksMap.fastAPI,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
value: 'flask',
|
|
||||||
label: frameworksMap.flask,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
value: 'falcon',
|
|
||||||
label: frameworksMap.falcon,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
value: 'other',
|
|
||||||
label: frameworksMap.other,
|
|
||||||
},
|
|
||||||
]}
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div className="service-name-container">
|
|
||||||
<div className="label"> Service Name </div>
|
|
||||||
|
|
||||||
<Form form={form} name="service-name" style={{ minWidth: '300px' }}>
|
|
||||||
<Form.Item
|
|
||||||
hasFeedback
|
|
||||||
name="Service Name"
|
|
||||||
rules={[{ required: true }]}
|
|
||||||
validateTrigger="onBlur"
|
|
||||||
>
|
|
||||||
<Input autoFocus />
|
|
||||||
</Form.Item>
|
|
||||||
</Form>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div className="content-container">
|
|
||||||
<MarkdownRenderer
|
|
||||||
markdownContent={selectedFrameWorkDocs}
|
|
||||||
variables={variables}
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
)}
|
|
||||||
{activeStep === 3 && (
|
|
||||||
<ConnectionStatus
|
|
||||||
serviceName={form.getFieldValue('Service Name')}
|
|
||||||
language="python"
|
|
||||||
framework={selectedFrameWork}
|
|
||||||
/>
|
|
||||||
)}
|
|
||||||
</>
|
|
||||||
);
|
|
||||||
}
|
|
@ -1,68 +0,0 @@
|
|||||||
import './ROR.styles.scss';
|
|
||||||
|
|
||||||
import { Form, Input } from 'antd';
|
|
||||||
import { MarkdownRenderer } from 'components/MarkdownRenderer/MarkdownRenderer';
|
|
||||||
import Header from 'container/OnboardingContainer/common/Header/Header';
|
|
||||||
|
|
||||||
import { LangProps } from '../APM';
|
|
||||||
import ConnectionStatus from '../common/ConnectionStatus/ConnectionStatus';
|
|
||||||
import RORDocs from './RubyOnRails.md';
|
|
||||||
|
|
||||||
export default function RoR({
|
|
||||||
ingestionInfo,
|
|
||||||
activeStep,
|
|
||||||
}: LangProps): JSX.Element {
|
|
||||||
const [form] = Form.useForm();
|
|
||||||
const serviceName = Form.useWatch('Service Name', form);
|
|
||||||
|
|
||||||
const variables = {
|
|
||||||
MYAPP: serviceName || '<service-name>',
|
|
||||||
SIGNOZ_INGESTION_KEY:
|
|
||||||
ingestionInfo.SIGNOZ_INGESTION_KEY || '<SIGNOZ_INGESTION_KEY>',
|
|
||||||
REGION: ingestionInfo.REGION || 'region',
|
|
||||||
};
|
|
||||||
|
|
||||||
return (
|
|
||||||
<>
|
|
||||||
{activeStep === 2 && (
|
|
||||||
<div className="ror-setup-instructions-container">
|
|
||||||
<Header
|
|
||||||
entity="rails"
|
|
||||||
heading="Ruby on Rails OpenTelemetry Instrumentation"
|
|
||||||
imgURL="/Logos/rails.png"
|
|
||||||
docsURL="https://signoz.io/docs/instrumentation/ruby-on-rails/"
|
|
||||||
imgClassName="supported-language-img"
|
|
||||||
/>
|
|
||||||
|
|
||||||
<div className="form-container">
|
|
||||||
<div className="service-name-container">
|
|
||||||
<div className="label"> Service Name </div>
|
|
||||||
|
|
||||||
<Form form={form} name="service-name" style={{ minWidth: '300px' }}>
|
|
||||||
<Form.Item
|
|
||||||
hasFeedback
|
|
||||||
name="Service Name"
|
|
||||||
rules={[{ required: true }]}
|
|
||||||
validateTrigger="onBlur"
|
|
||||||
>
|
|
||||||
<Input autoFocus />
|
|
||||||
</Form.Item>
|
|
||||||
</Form>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div className="content-container">
|
|
||||||
<MarkdownRenderer markdownContent={RORDocs} variables={variables} />
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
)}
|
|
||||||
{activeStep === 3 && (
|
|
||||||
<ConnectionStatus
|
|
||||||
serviceName={form.getFieldValue('Service Name')}
|
|
||||||
framework="rails"
|
|
||||||
language="rails"
|
|
||||||
/>
|
|
||||||
)}
|
|
||||||
</>
|
|
||||||
);
|
|
||||||
}
|
|
@ -1,45 +0,0 @@
|
|||||||
.infrastructure-monitoring-module-container {
|
|
||||||
padding: 48px 0;
|
|
||||||
|
|
||||||
.module-header {
|
|
||||||
h1 {
|
|
||||||
font-size: 24px;
|
|
||||||
font-weight: 500;
|
|
||||||
}
|
|
||||||
|
|
||||||
h4 {
|
|
||||||
font-size: 14px;
|
|
||||||
font-weight: 300;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.content-container {
|
|
||||||
.heading {
|
|
||||||
.title {
|
|
||||||
a {
|
|
||||||
color: rgb(232, 112, 64);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.subheading {
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
gap: 12px;
|
|
||||||
margin-bottom: 16px;
|
|
||||||
|
|
||||||
.recevier-types {
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.header {
|
|
||||||
display: flex;
|
|
||||||
gap: 16px;
|
|
||||||
justify-content: flex-start;
|
|
||||||
align-items: center;
|
|
||||||
margin: 16px 0;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,154 +0,0 @@
|
|||||||
/* eslint-disable jsx-a11y/no-static-element-interactions */
|
|
||||||
/* eslint-disable jsx-a11y/click-events-have-key-events */
|
|
||||||
import './InfrastructureMonitoring.styles.scss';
|
|
||||||
|
|
||||||
import cx from 'classnames';
|
|
||||||
import { Code, Pre } from 'components/MarkdownRenderer/MarkdownRenderer';
|
|
||||||
import { useEffect, useState } from 'react';
|
|
||||||
import ReactMarkdown from 'react-markdown';
|
|
||||||
import { trackEvent } from 'utils/segmentAnalytics';
|
|
||||||
|
|
||||||
import Header from '../common/Header/Header';
|
|
||||||
import hostMetricsMonitoring from './md-docs/hostMetricsMonitoring.md';
|
|
||||||
import k8sInfraMonitoringDocs from './md-docs/kubernetesInfraMonitoring.md';
|
|
||||||
import otherMetrics from './md-docs/otherMetrics.md';
|
|
||||||
|
|
||||||
export default function InfrastructureMonitoring({
|
|
||||||
activeStep,
|
|
||||||
}: {
|
|
||||||
activeStep: number;
|
|
||||||
}): JSX.Element {
|
|
||||||
const [selectedInfraMetrics, setSelectedInfraMetrics] = useState('kubernetes');
|
|
||||||
const [selectedInfraMetricsDocs, setSelectedInfraMetricsDocs] = useState(
|
|
||||||
k8sInfraMonitoringDocs,
|
|
||||||
);
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
// on metrics Type select
|
|
||||||
trackEvent('Onboarding: APM : Java', {
|
|
||||||
selectedInfraMetrics,
|
|
||||||
});
|
|
||||||
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
||||||
}, [selectedInfraMetrics]);
|
|
||||||
|
|
||||||
const supportedInfraMetrics = [
|
|
||||||
{
|
|
||||||
name: 'Kubernetes Infra Metrics',
|
|
||||||
id: 'kubernetes',
|
|
||||||
imgURL: `Logos/kubernetes.svg`,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'HostMetrics',
|
|
||||||
id: 'hostMetrics',
|
|
||||||
imgURL: `Logos/software-window.svg`,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'Other Metrics',
|
|
||||||
id: 'otherMetrics',
|
|
||||||
imgURL: `Logos/cmd-terminal.svg`,
|
|
||||||
},
|
|
||||||
];
|
|
||||||
|
|
||||||
const handleMetricsTypeChange = (selectedMetricsType: string): void => {
|
|
||||||
setSelectedInfraMetrics(selectedMetricsType);
|
|
||||||
|
|
||||||
switch (selectedMetricsType) {
|
|
||||||
case 'kubernetes':
|
|
||||||
setSelectedInfraMetricsDocs(k8sInfraMonitoringDocs);
|
|
||||||
break;
|
|
||||||
case 'hostMetrics':
|
|
||||||
setSelectedInfraMetricsDocs(hostMetricsMonitoring);
|
|
||||||
break;
|
|
||||||
case 'otherMetrics':
|
|
||||||
setSelectedInfraMetricsDocs(otherMetrics);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
setSelectedInfraMetricsDocs(otherMetrics);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
const getHeaderBasedOnType = (): JSX.Element => {
|
|
||||||
switch (selectedInfraMetrics) {
|
|
||||||
case 'hostMetrics':
|
|
||||||
return (
|
|
||||||
<Header
|
|
||||||
entity="hostMetrics"
|
|
||||||
heading="Host Metrics"
|
|
||||||
imgURL="/Logos/software-window.svg"
|
|
||||||
docsURL="https://signoz.io/docs/tutorial/opentelemetry-binary-usage-in-virtual-machine/"
|
|
||||||
imgClassName="supported-logs-type-img"
|
|
||||||
/>
|
|
||||||
);
|
|
||||||
|
|
||||||
case 'otherMetrics':
|
|
||||||
return (
|
|
||||||
<Header
|
|
||||||
entity="otherMetrics"
|
|
||||||
heading="Other Metrics"
|
|
||||||
imgURL="/Logos/cmd-terminal.svg"
|
|
||||||
docsURL="https://signoz.io/docs/userguide/send-metrics-cloud/"
|
|
||||||
imgClassName="supported-logs-type-img"
|
|
||||||
/>
|
|
||||||
);
|
|
||||||
|
|
||||||
default:
|
|
||||||
return (
|
|
||||||
<Header
|
|
||||||
entity="kubernetes"
|
|
||||||
heading="Kubernetes Metrics"
|
|
||||||
imgURL="/Logos/kubernetes.svg"
|
|
||||||
docsURL="https://signoz.io/docs/tutorial/kubernetes-infra-metrics/"
|
|
||||||
imgClassName="supported-logs-type-img"
|
|
||||||
/>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
return (
|
|
||||||
<div className="infrastructure-monitoring-module-container">
|
|
||||||
{activeStep === 2 && (
|
|
||||||
<>
|
|
||||||
<div className="module-header">
|
|
||||||
<h1>Select an Infra Metrics type</h1>
|
|
||||||
{/* <h4> Choose the logs that you want to receive on SigNoz </h4> */}
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div className="supported-logs-type-container">
|
|
||||||
{supportedInfraMetrics.map((logType) => (
|
|
||||||
<div
|
|
||||||
className={cx(
|
|
||||||
'supported-logs-type',
|
|
||||||
selectedInfraMetrics === logType.id ? 'selected' : '',
|
|
||||||
)}
|
|
||||||
key={logType.name}
|
|
||||||
onClick={(): void => handleMetricsTypeChange(logType.id)}
|
|
||||||
>
|
|
||||||
<img
|
|
||||||
className={cx('supported-logs-type-img')}
|
|
||||||
src={`${logType.imgURL}`}
|
|
||||||
alt=""
|
|
||||||
/>
|
|
||||||
|
|
||||||
<div> {logType.name} </div>
|
|
||||||
</div>
|
|
||||||
))}
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{getHeaderBasedOnType()}
|
|
||||||
|
|
||||||
<div className="content-container">
|
|
||||||
<ReactMarkdown
|
|
||||||
components={{
|
|
||||||
pre: Pre,
|
|
||||||
code: Code,
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
{selectedInfraMetricsDocs}
|
|
||||||
</ReactMarkdown>
|
|
||||||
</div>
|
|
||||||
</>
|
|
||||||
)}
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
}
|
|
@ -1,10 +0,0 @@
|
|||||||
## Hostmetrics Monitoring
|
|
||||||
You can collect Hostmetrics from your VM and send it to SigNoz cloud using OpenTelemetry Collector.
|
|
||||||
|
|
||||||
Steps to send hostmetrics to SigNoz Cloud:
|
|
||||||
|
|
||||||
- Install OpenTelemetry Collector binary agent. Please find instructions [here](https://signoz.io/docs/tutorial/opentelemetry-binary-usage-in-virtual-machine/#setup-otel-collector-as-agent).
|
|
||||||
|
|
||||||
- Import Hostmetrics Dashboard in SigNoz. Please find instructions [here](https://signoz.io/docs/tutorial/opentelemetry-binary-usage-in-virtual-machine/#hostmetrics-dashboard).
|
|
||||||
|
|
||||||
Learn how to create dashboards and panels [here](https://signoz.io/docs/userguide/manage-dashboards-and-panels/).
|
|
@ -1,9 +0,0 @@
|
|||||||
## Kubernetes Infra Metrics
|
|
||||||
|
|
||||||
You can collect Kubernetes infra metrics from your k8s cluster and send it to SigNoz cloud using k8s-infra chart.
|
|
||||||
|
|
||||||
Steps to send kubernetes infra metrics to SigNoz Cloud:
|
|
||||||
|
|
||||||
- Install OpenTelemetry Collectors in your k8s infra. Please find instructions [here](https://signoz.io/docs/tutorial/kubernetes-infra-metrics/).
|
|
||||||
|
|
||||||
- Plot metrics in SigNoz UI by following the instructions [here](https://signoz.io/docs/tutorial/kubernetes-infra-metrics/#plot-metrics-in-signoz-ui).
|
|
@ -1,195 +0,0 @@
|
|||||||
## Send metrics from any third-party integrations
|
|
||||||
|
|
||||||
This document helps you to send metrics from any third-party integrations such as RabbitMQ, Nginx, MySQL, etc.
|
|
||||||
|
|
||||||
There are two ways in which you can send metrics to SigNoz using OpenTelemetry:
|
|
||||||
|
|
||||||
- From your application
|
|
||||||
- From OpenTelemetry Collector
|
|
||||||
|
|
||||||
In this document, we will cover how to send metrics from OpenTelemetry Collector. The Collector is a swiss-army knife that can collect metrics from various sources and send them to SigNoz.
|
|
||||||
|
|
||||||
- Enable a Specific Metric Receiver
|
|
||||||
- Enable a Prometheus Receiver
|
|
||||||
|
|
||||||
## Enable a Specific Metric Receiver
|
|
||||||
|
|
||||||
SigNoz supports all the receivers that are listed in the [opentelemetry-collector-contrib](https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/receiver) GitHub repository. To configure a new metric receiver, you must edit the `receivers` and `service::pipelines` sections of the `otel-collector-config.yaml` file. The following example shows the default configuration in which the `hostmetrics` receiver is enabled:
|
|
||||||
|
|
||||||
```yaml {8-20,52}
|
|
||||||
receivers:
|
|
||||||
otlp:
|
|
||||||
protocols:
|
|
||||||
grpc:
|
|
||||||
endpoint: localhost:4317
|
|
||||||
http:
|
|
||||||
endpoint: localhost:4318
|
|
||||||
hostmetrics:
|
|
||||||
collection_interval: 30s
|
|
||||||
scrapers:
|
|
||||||
cpu: {}
|
|
||||||
disk: {}
|
|
||||||
load: {}
|
|
||||||
filesystem: {}
|
|
||||||
memory: {}
|
|
||||||
network: {}
|
|
||||||
paging: {}
|
|
||||||
process:
|
|
||||||
mute_process_name_error: true
|
|
||||||
processes: {}
|
|
||||||
processors:
|
|
||||||
batch:
|
|
||||||
send_batch_size: 1000
|
|
||||||
timeout: 10s
|
|
||||||
# Ref: https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/processor/resourcedetectionprocessor/README.md
|
|
||||||
resourcedetection:
|
|
||||||
detectors: [env, system, ec2] # include ec2 for AWS, gce for GCP and azure for Azure.
|
|
||||||
# Using OTEL_RESOURCE_ATTRIBUTES envvar, env detector adds custom labels.
|
|
||||||
timeout: 2s
|
|
||||||
override: false
|
|
||||||
system:
|
|
||||||
hostname_sources: [os] # alternatively, use [dns,os] for setting FQDN as host.name and os as fallback
|
|
||||||
exporters:
|
|
||||||
otlp:
|
|
||||||
endpoint: 'ingest.{region}.signoz.cloud:443' # replace {region} with your region
|
|
||||||
tls:
|
|
||||||
insecure: false
|
|
||||||
headers:
|
|
||||||
'signoz-access-token': '<SIGNOZ_INGESTION_KEY>'
|
|
||||||
logging:
|
|
||||||
loglevel: debug
|
|
||||||
service:
|
|
||||||
telemetry:
|
|
||||||
metrics:
|
|
||||||
address: localhost:8888
|
|
||||||
pipelines:
|
|
||||||
metrics:
|
|
||||||
receivers: [otlp]
|
|
||||||
processors: [batch]
|
|
||||||
exporters: [otlp]
|
|
||||||
metrics/hostmetrics:
|
|
||||||
receivers: [hostmetrics]
|
|
||||||
processors: [resourcedetection, batch]
|
|
||||||
exporters: [otlp]
|
|
||||||
```
|
|
||||||
|
|
||||||
Depending on the choice of your region for SigNoz cloud, the ingest endpoint will vary according to this table.
|
|
||||||
|
|
||||||
US - ingest.us.signoz.cloud:443
|
|
||||||
|
|
||||||
IN - ingest.in.signoz.cloud:443
|
|
||||||
|
|
||||||
EU - ingest.eu.signoz.cloud:443
|
|
||||||
|
|
||||||
To enable a new OpenTelemetry receiver, follow the steps below:
|
|
||||||
|
|
||||||
1. Open the `otel-collector-config.yaml` file in a plain-text editor.
|
|
||||||
2. Configure your receivers. The following example shows how you can enable a `rabbitmq` receiver:
|
|
||||||
|
|
||||||
```yaml {21-25,53}
|
|
||||||
receivers:
|
|
||||||
otlp:
|
|
||||||
protocols:
|
|
||||||
grpc:
|
|
||||||
endpoint: localhost:4317
|
|
||||||
http:
|
|
||||||
endpoint: localhost:4318
|
|
||||||
hostmetrics:
|
|
||||||
collection_interval: 30s
|
|
||||||
scrapers:
|
|
||||||
cpu: {}
|
|
||||||
disk: {}
|
|
||||||
load: {}
|
|
||||||
filesystem: {}
|
|
||||||
memory: {}
|
|
||||||
network: {}
|
|
||||||
paging: {}
|
|
||||||
process:
|
|
||||||
mute_process_name_error: true
|
|
||||||
processes: {}
|
|
||||||
rabbitmq:
|
|
||||||
endpoint: http://localhost:15672
|
|
||||||
username: <RABBITMQ_USERNAME>
|
|
||||||
password: <RABBITMQ_PASSWORD>
|
|
||||||
collection_interval: 10s
|
|
||||||
processors:
|
|
||||||
batch:
|
|
||||||
send_batch_size: 1000
|
|
||||||
timeout: 10s
|
|
||||||
# Ref: https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/processor/resourcedetectionprocessor/README.md
|
|
||||||
resourcedetection:
|
|
||||||
detectors: [env, system, ec2] # include ec2 for AWS, gce for GCP and azure for Azure.
|
|
||||||
# Using OTEL_RESOURCE_ATTRIBUTES envvar, env detector adds custom labels.
|
|
||||||
timeout: 2s
|
|
||||||
override: false
|
|
||||||
system:
|
|
||||||
hostname_sources: [os] # alternatively, use [dns,os] for setting FQDN as host.name and os as fallback
|
|
||||||
exporters:
|
|
||||||
otlp:
|
|
||||||
endpoint: 'ingest.{region}.signoz.cloud:443' # replace {region} with your region
|
|
||||||
tls:
|
|
||||||
insecure: false
|
|
||||||
headers:
|
|
||||||
'signoz-access-token': '<SIGNOZ_INGESTION_KEY>'
|
|
||||||
logging:
|
|
||||||
loglevel: debug
|
|
||||||
service:
|
|
||||||
telemetry:
|
|
||||||
metrics:
|
|
||||||
address: localhost:8888
|
|
||||||
pipelines:
|
|
||||||
metrics:
|
|
||||||
receivers: [otlp, rabbitmq]
|
|
||||||
processors: [batch]
|
|
||||||
exporters: [otlp]
|
|
||||||
metrics/hostmetrics:
|
|
||||||
receivers: [hostmetrics]
|
|
||||||
processors: [resourcedetection, batch]
|
|
||||||
exporters: [otlp]
|
|
||||||
```
|
|
||||||
|
|
||||||
For details about configuring OpenTelemetry receivers, see the [README](https://github.com/open-telemetry/opentelemetry-collector/blob/main/receiver/README.md) page of the `opentelemetry-collector` GitHub repository.
|
|
||||||
|
|
||||||
## Enable a Prometheus Receiver
|
|
||||||
|
|
||||||
SigNoz supports all the exporters that are listed on the [Exporters and Integrations](https://prometheus.io/docs/instrumenting/exporters/) page of the Prometheus documentation. If you have a running Prometheus instance, and you expose metrics in Prometheus, then you can scrape them in SigNoz by configuring Prometheus receivers in the `receivers::prometheus::config::scrape_configs` section of the `otel-collector-config.yaml` file.
|
|
||||||
|
|
||||||
To enable a Prometheus receiver, follow the steps below:
|
|
||||||
|
|
||||||
1. Open the `otel-collector-config.yaml` file in a plain-text editor.
|
|
||||||
2. Enable a new Prometheus receiver. Depending on your use case, there are two ways in which you can enable a new Prometheus exporter:
|
|
||||||
- **By creating a new job**: The following example shows how you can enable a Prometheus receiver by creating a new job named `my-new-job`:
|
|
||||||
```yaml {10-13}
|
|
||||||
...
|
|
||||||
# Data sources: metrics
|
|
||||||
prometheus:
|
|
||||||
config:
|
|
||||||
scrape_configs:
|
|
||||||
- job_name: "otel-collector"
|
|
||||||
scrape_interval: 30s
|
|
||||||
static_configs:
|
|
||||||
- targets: ["otel-collector:8889"]
|
|
||||||
- job_name: "my-new-job"
|
|
||||||
scrape_interval: 30s
|
|
||||||
static_configs:
|
|
||||||
- targets: ["localhost:8080"]
|
|
||||||
...
|
|
||||||
# This file was truncated for brevity.
|
|
||||||
```
|
|
||||||
- **By adding a new target to an existing job**: The following example shows the default `otel-collector` job to which a new target (`localhost:8080`) was added:
|
|
||||||
```yaml {9}
|
|
||||||
...
|
|
||||||
# Data sources: metrics
|
|
||||||
prometheus:
|
|
||||||
config:
|
|
||||||
scrape_configs:
|
|
||||||
- job_name: "otel-collector"
|
|
||||||
scrape_interval: 30s
|
|
||||||
static_configs:
|
|
||||||
- targets: ["otel-collector:8889", "localhost:8080"]
|
|
||||||
...
|
|
||||||
# This file was truncated for brevity.
|
|
||||||
```
|
|
||||||
Note that all the jobs are scraped in parallel, and all targets inside a job are scraped serially. For more details about configuring jobs and targets, see the following sections of the Prometheus documentation:
|
|
||||||
- [<Scrape_config>](https://prometheus.io/docs/prometheus/latest/configuration/configuration/#scrape_config)
|
|
||||||
- [Jobs and Instances](https://prometheus.io/docs/concepts/jobs_instances/)
|
|
@ -1,53 +0,0 @@
|
|||||||
import { Code, Pre } from 'components/MarkdownRenderer/MarkdownRenderer';
|
|
||||||
import Header from 'container/OnboardingContainer/common/Header/Header';
|
|
||||||
import ReactMarkdown from 'react-markdown';
|
|
||||||
|
|
||||||
import ConnectionStatus from '../common/LogsConnectionStatus/LogsConnectionStatus';
|
|
||||||
import LogsFromLogFile from './applicationLogsFromLogFile.md';
|
|
||||||
|
|
||||||
interface ApplicationLogsProps {
|
|
||||||
type: string;
|
|
||||||
activeStep: number;
|
|
||||||
}
|
|
||||||
|
|
||||||
const collectLogsFromFileURL =
|
|
||||||
'https://signoz.io/docs/userguide/collect_logs_from_file/';
|
|
||||||
|
|
||||||
export default function ApplicationLogs({
|
|
||||||
type,
|
|
||||||
activeStep,
|
|
||||||
}: ApplicationLogsProps): JSX.Element {
|
|
||||||
const docsURL = collectLogsFromFileURL;
|
|
||||||
|
|
||||||
return (
|
|
||||||
<>
|
|
||||||
{activeStep === 2 && (
|
|
||||||
<div className="golang-setup-instructions-container">
|
|
||||||
<Header
|
|
||||||
entity="docker"
|
|
||||||
heading="Collecting Application Logs from Log file"
|
|
||||||
imgURL={`/Logos/${'software-window'}.svg`}
|
|
||||||
docsURL={docsURL}
|
|
||||||
imgClassName="supported-logs-type-img"
|
|
||||||
/>
|
|
||||||
|
|
||||||
<div className="content-container">
|
|
||||||
<ReactMarkdown
|
|
||||||
components={{
|
|
||||||
pre: Pre,
|
|
||||||
code: Code,
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
{LogsFromLogFile}
|
|
||||||
</ReactMarkdown>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
)}
|
|
||||||
{activeStep === 3 && (
|
|
||||||
<div className="connection-status-container">
|
|
||||||
<ConnectionStatus logType={type} />
|
|
||||||
</div>
|
|
||||||
)}
|
|
||||||
</>
|
|
||||||
);
|
|
||||||
}
|
|
@ -1,44 +0,0 @@
|
|||||||
import { Code, Pre } from 'components/MarkdownRenderer/MarkdownRenderer';
|
|
||||||
import Header from 'container/OnboardingContainer/common/Header/Header';
|
|
||||||
import ReactMarkdown from 'react-markdown';
|
|
||||||
|
|
||||||
import ConnectionStatus from '../common/LogsConnectionStatus/LogsConnectionStatus';
|
|
||||||
import DockerDocs from './docker.md';
|
|
||||||
|
|
||||||
export default function Docker({
|
|
||||||
activeStep,
|
|
||||||
}: {
|
|
||||||
activeStep: number;
|
|
||||||
}): JSX.Element {
|
|
||||||
return (
|
|
||||||
<>
|
|
||||||
{activeStep === 2 && (
|
|
||||||
<div className="golang-setup-instructions-container">
|
|
||||||
<Header
|
|
||||||
entity="docker"
|
|
||||||
heading="Collecting Docker container logs"
|
|
||||||
imgURL="/Logos/docker.svg"
|
|
||||||
docsURL="https://signoz.io/docs/userguide/collect_docker_logs/"
|
|
||||||
imgClassName="supported-logs-type-img"
|
|
||||||
/>
|
|
||||||
|
|
||||||
<div className="content-container">
|
|
||||||
<ReactMarkdown
|
|
||||||
components={{
|
|
||||||
pre: Pre,
|
|
||||||
code: Code,
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
{DockerDocs}
|
|
||||||
</ReactMarkdown>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
)}
|
|
||||||
{activeStep === 3 && (
|
|
||||||
<div className="connection-status-container">
|
|
||||||
<ConnectionStatus logType="docker" />
|
|
||||||
</div>
|
|
||||||
)}
|
|
||||||
</>
|
|
||||||
);
|
|
||||||
}
|
|
@ -1,97 +0,0 @@
|
|||||||
import { Select } from 'antd';
|
|
||||||
import { Code, Pre } from 'components/MarkdownRenderer/MarkdownRenderer';
|
|
||||||
import Header from 'container/OnboardingContainer/common/Header/Header';
|
|
||||||
import { useEffect, useState } from 'react';
|
|
||||||
import ReactMarkdown from 'react-markdown';
|
|
||||||
import { trackEvent } from 'utils/segmentAnalytics';
|
|
||||||
import { popupContainer } from 'utils/selectPopupContainer';
|
|
||||||
|
|
||||||
import FluentBit from './md-docs/fluentBit.md';
|
|
||||||
import FluentD from './md-docs/fluentD.md';
|
|
||||||
import LogStashDocs from './md-docs/logStash.md';
|
|
||||||
|
|
||||||
enum FrameworksMap {
|
|
||||||
fluent_d = 'FluentD',
|
|
||||||
fluent_bit = 'FluentBit',
|
|
||||||
logstash = 'Logstash',
|
|
||||||
}
|
|
||||||
|
|
||||||
export default function ExistingCollectors(): JSX.Element {
|
|
||||||
const [selectedFrameWork, setSelectedFrameWork] = useState('fluent_d');
|
|
||||||
const [selectedFrameWorkDocs, setSelectedFrameWorkDocs] = useState(FluentD);
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
// on language select
|
|
||||||
trackEvent('Onboarding: Logs Management: Existing Collectors', {
|
|
||||||
selectedFrameWork,
|
|
||||||
});
|
|
||||||
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
||||||
}, [selectedFrameWork]);
|
|
||||||
|
|
||||||
const handleFrameworkChange = (selectedFrameWork: string): void => {
|
|
||||||
setSelectedFrameWork(selectedFrameWork);
|
|
||||||
|
|
||||||
switch (selectedFrameWork) {
|
|
||||||
case 'fluent_d':
|
|
||||||
setSelectedFrameWorkDocs(FluentD);
|
|
||||||
break;
|
|
||||||
case 'fluent_bit':
|
|
||||||
setSelectedFrameWorkDocs(FluentBit);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
setSelectedFrameWorkDocs(LogStashDocs);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
return (
|
|
||||||
<div className="java-setup-instructions-container">
|
|
||||||
<Header
|
|
||||||
entity="existing_collectors"
|
|
||||||
heading="Logs from existing collectors"
|
|
||||||
imgURL="/Logos/cmd-terminal.svg"
|
|
||||||
docsURL="https://signoz.io/docs/userguide/fluentbit_to_signoz/"
|
|
||||||
imgClassName="supported-language-img"
|
|
||||||
/>
|
|
||||||
|
|
||||||
<div className="form-container">
|
|
||||||
<div className="framework-selector">
|
|
||||||
<div className="label"> Select Framework </div>
|
|
||||||
|
|
||||||
<Select
|
|
||||||
getPopupContainer={popupContainer}
|
|
||||||
defaultValue="fluent_d"
|
|
||||||
style={{ minWidth: 120 }}
|
|
||||||
placeholder="Select Framework"
|
|
||||||
onChange={(value): void => handleFrameworkChange(value)}
|
|
||||||
options={[
|
|
||||||
{
|
|
||||||
value: 'fluent_d',
|
|
||||||
label: FrameworksMap.fluent_d,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
value: 'fluent_bit',
|
|
||||||
label: FrameworksMap.fluent_bit,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
value: 'logstash',
|
|
||||||
label: FrameworksMap.logstash,
|
|
||||||
},
|
|
||||||
]}
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div className="content-container">
|
|
||||||
<ReactMarkdown
|
|
||||||
components={{
|
|
||||||
pre: Pre,
|
|
||||||
code: Code,
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
{selectedFrameWorkDocs}
|
|
||||||
</ReactMarkdown>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
}
|
|
@ -1,58 +0,0 @@
|
|||||||
## Collect Logs Using FluentBit in SigNoz cloud
|
|
||||||
|
|
||||||
If you use fluentBit to collect logs in your stack, you will be able to send logs from fluentBit to SigNoz.
|
|
||||||
|
|
||||||
At SigNoz we use opentelemetry collector to recieve logs which supports the fluentforward protocol. So you can forward your logs from your fluentBit agent to opentelemetry collector using fluentforward protocol.
|
|
||||||
|
|
||||||
* Add otel collector binary to your VM by following this [guide](https://signoz.io/docs/tutorial/opentelemetry-binary-usage-in-virtual-machine/).
|
|
||||||
|
|
||||||
* Add fluentforward reciever to your `config.yaml`
|
|
||||||
```yaml
|
|
||||||
receivers:
|
|
||||||
fluentforward:
|
|
||||||
endpoint: 0.0.0.0:24224
|
|
||||||
```
|
|
||||||
Here we have used port 24224 for listening in fluentforward protocol, but you can change it to a port you want.
|
|
||||||
You can read more about fluentforward receiver [here](https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/receiver/fluentforwardreceiver).
|
|
||||||
|
|
||||||
* Modify your `config.yaml` and add the above receiver
|
|
||||||
```yaml {4}
|
|
||||||
service:
|
|
||||||
....
|
|
||||||
logs:
|
|
||||||
receivers: [otlp, fluentforward]
|
|
||||||
processors: [batch]
|
|
||||||
exporters: [otlp]
|
|
||||||
```
|
|
||||||
|
|
||||||
* Add the following to your fluentBit config to forward the logs to otel collector.
|
|
||||||
```
|
|
||||||
[OUTPUT]
|
|
||||||
Name forward
|
|
||||||
Match *
|
|
||||||
Host localhost
|
|
||||||
Port 24224
|
|
||||||
```
|
|
||||||
In this config we are forwarding the logs to the otel collector which is listening on port 24224.
|
|
||||||
Also we are assuming that you are running the fluentBit binary on the host. If not, the value of `host` might change depending on your environment.
|
|
||||||
|
|
||||||
* Once you make this changes you can restart fluentBit and otel-binary, and you will be able to see the logs in SigNoz.
|
|
||||||
|
|
||||||
* To properly transform your existing log model into opentelemetry [log](https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/logs/data-model.md) model you can use the different processors provided by opentelemetry. ([link](https://signoz.io/docs/userguide/logs/#processors-available-for-processing-logs))
|
|
||||||
|
|
||||||
eg:-
|
|
||||||
```yaml
|
|
||||||
processors:
|
|
||||||
logstransform:
|
|
||||||
operators:
|
|
||||||
- type: trace_parser
|
|
||||||
trace_id:
|
|
||||||
parse_from: attributes.trace_id
|
|
||||||
span_id:
|
|
||||||
parse_from: attributes.span_id
|
|
||||||
- type: remove
|
|
||||||
field: attributes.trace_id
|
|
||||||
- type: remove
|
|
||||||
field: attributes.span_id
|
|
||||||
```
|
|
||||||
The operations in the above processor will parse the trace_id and span_id from log to opentelemetry log model and remove them from attributes.
|
|
@ -1,66 +0,0 @@
|
|||||||
## Collect Logs Using FluentD in SigNoz cloud
|
|
||||||
|
|
||||||
If you use fluentD to collect logs in your stack, you will be able to send logs from fluentD to SigNoz.
|
|
||||||
|
|
||||||
At SigNoz, we use opentelemetry collector to recieve logs which supports the fluentforward protocol. So you can forward your logs from your fluentD agent to opentelemetry collector.
|
|
||||||
|
|
||||||
* Add otel collector binary to your VM by following this [guide](https://signoz.io/docs/tutorial/opentelemetry-binary-usage-in-virtual-machine/).
|
|
||||||
|
|
||||||
* Add fluentforward reciever to your `config.yaml`
|
|
||||||
```yaml
|
|
||||||
receivers:
|
|
||||||
fluentforward:
|
|
||||||
endpoint: 0.0.0.0:24224
|
|
||||||
```
|
|
||||||
Here we have used port 24224 for listening in fluentforward protocol, but you can change it to a port you want.
|
|
||||||
You can read more about fluentforward receiver [here](https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/receiver/fluentforwardreceiver).
|
|
||||||
|
|
||||||
* Modify your `config.yaml` and add the above receiver
|
|
||||||
```yaml {4}
|
|
||||||
service:
|
|
||||||
....
|
|
||||||
logs:
|
|
||||||
receivers: [otlp, fluentforward]
|
|
||||||
processors: [batch]
|
|
||||||
exporters: [otlp]
|
|
||||||
```
|
|
||||||
|
|
||||||
* Add the following to your fluentD config to forward the logs to otel collector.
|
|
||||||
```
|
|
||||||
<match <directive>>
|
|
||||||
@type forward
|
|
||||||
send_timeout 60s
|
|
||||||
recover_wait 10s
|
|
||||||
hard_timeout 60s
|
|
||||||
|
|
||||||
<server>
|
|
||||||
name myserver1
|
|
||||||
host localhost
|
|
||||||
port 24224
|
|
||||||
</server>
|
|
||||||
</match>
|
|
||||||
```
|
|
||||||
In this config we are matching a directive and forwarding logs to the otel collector which is listening on port 24224. Replace `<directive>` with your directive name.
|
|
||||||
Also we are assuming that you are running the fluentD binary on the host. If not, the value of `host` might change depending on your environment.
|
|
||||||
* Once you make this changes you can restart fluentD and otel-binary, and you will be able to see the logs in SigNoz.
|
|
||||||
|
|
||||||
* To properly transform your existing log model into opentelemetry [log](https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/logs/data-model.md) model you can use the different processors provided by opentelemetry. ([link](https://signoz.io/docs/userguide/logs/#processors-available-for-processing-logs))
|
|
||||||
|
|
||||||
eg:-
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
processors:
|
|
||||||
logstransform:
|
|
||||||
operators:
|
|
||||||
- type: trace_parser
|
|
||||||
trace_id:
|
|
||||||
parse_from: attributes.trace_id
|
|
||||||
span_id:
|
|
||||||
parse_from: attributes.span_id
|
|
||||||
- type: remove
|
|
||||||
field: attributes.trace_id
|
|
||||||
- type: remove
|
|
||||||
field: attributes.span_id
|
|
||||||
```
|
|
||||||
|
|
||||||
The operations in the above processor will parse the trace_id and span_id from log to opentelemetry log model and remove them from attributes.
|
|
@ -1,48 +0,0 @@
|
|||||||
## Collect Logs Using Logstash in SigNoz cloud
|
|
||||||
|
|
||||||
If you use logstash to collect logs in your stack, you will be able to send logs from Logstash to SigNoz.
|
|
||||||
|
|
||||||
At SigNoz we use OpenTelemetry Collector to recieve logs which supports the TCP protocol. So you can forward your logs from the logstash agent to opentelemetry collector.
|
|
||||||
|
|
||||||
* Add otel collector binary to your VM by following this [guide](https://signoz.io/docs/tutorial/opentelemetry-binary-usage-in-virtual-machine/).
|
|
||||||
|
|
||||||
* Add the reciever to your `config.yaml`
|
|
||||||
```yaml
|
|
||||||
receivers:
|
|
||||||
tcplog/logstash:
|
|
||||||
max_log_size: 1MiB
|
|
||||||
listen_address: "0.0.0.0:2255"
|
|
||||||
attributes: {}
|
|
||||||
resource: {}
|
|
||||||
add_attributes: false
|
|
||||||
operators: []
|
|
||||||
```
|
|
||||||
Here we have used port 2255 for listening in TCP protocol, but you can change it to a port you want.
|
|
||||||
You can read more about tcplog reciver [here](https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/receiver/tcplogreceiver).
|
|
||||||
|
|
||||||
* Modify your `config.yaml` and add the above receiver
|
|
||||||
```yaml {4}
|
|
||||||
service:
|
|
||||||
....
|
|
||||||
logs:
|
|
||||||
receivers: [otlp, tcplog/logstash]
|
|
||||||
processors: [batch]
|
|
||||||
exporters: [otlp]
|
|
||||||
```
|
|
||||||
|
|
||||||
* Change the logstash config to forward the logs to otel collector.
|
|
||||||
```
|
|
||||||
output {
|
|
||||||
tcp {
|
|
||||||
codec => json_lines # this is required otherwise it will send eveything in a single line
|
|
||||||
host => "localhost"
|
|
||||||
port => 2255
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
Here we are configuring logstash to send logs to otel-collector that we ran in the previous step, which is listening on port 2255.
|
|
||||||
Also we are assuming that you are running the logstash binary on the host. If not, the value of `host` might change depending on your environment.
|
|
||||||
|
|
||||||
* Once you make this changes you can otel binary and logstash, and you will be able to see the logs in SigNoz.
|
|
||||||
|
|
||||||
* To properly transform your existing log model into opentelemetry [log](https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/logs/data-model.md) model you can use the different processors provided by opentelemetry ([link](https://signoz.io/docs/userguide/logs/#processors-available-for-processing-logs)).
|
|
@ -1,44 +0,0 @@
|
|||||||
import { Code, Pre } from 'components/MarkdownRenderer/MarkdownRenderer';
|
|
||||||
import Header from 'container/OnboardingContainer/common/Header/Header';
|
|
||||||
import ReactMarkdown from 'react-markdown';
|
|
||||||
|
|
||||||
import ConnectionStatus from '../common/LogsConnectionStatus/LogsConnectionStatus';
|
|
||||||
import KubernetesDocs from './kubernetes.md';
|
|
||||||
|
|
||||||
export default function Kubernetes({
|
|
||||||
activeStep,
|
|
||||||
}: {
|
|
||||||
activeStep: number;
|
|
||||||
}): JSX.Element {
|
|
||||||
return (
|
|
||||||
<>
|
|
||||||
{activeStep === 2 && (
|
|
||||||
<div className="golang-setup-instructions-container">
|
|
||||||
<Header
|
|
||||||
entity="kubernetes"
|
|
||||||
heading="Collecting Kubernetes Pod logs"
|
|
||||||
imgURL="/Logos/kubernetes.svg"
|
|
||||||
docsURL="https://signoz.io/docs/userguide/collect_kubernetes_pod_logs/#collect-kubernetes-pod-logs-in-signoz-cloud"
|
|
||||||
imgClassName="supported-logs-type-img"
|
|
||||||
/>
|
|
||||||
|
|
||||||
<div className="content-container">
|
|
||||||
<ReactMarkdown
|
|
||||||
components={{
|
|
||||||
pre: Pre,
|
|
||||||
code: Code,
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
{KubernetesDocs}
|
|
||||||
</ReactMarkdown>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
)}
|
|
||||||
{activeStep === 3 && (
|
|
||||||
<div className="connection-status-container">
|
|
||||||
<ConnectionStatus logType="kubernetes" />
|
|
||||||
</div>
|
|
||||||
)}
|
|
||||||
</>
|
|
||||||
);
|
|
||||||
}
|
|
@ -1,152 +0,0 @@
|
|||||||
.logs-management-module-container {
|
|
||||||
min-height: calc(100vh - 300px);
|
|
||||||
padding: 48px 0;
|
|
||||||
|
|
||||||
.header {
|
|
||||||
h1 {
|
|
||||||
font-size: 24px;
|
|
||||||
font-weight: 500;
|
|
||||||
}
|
|
||||||
|
|
||||||
h4 {
|
|
||||||
font-size: 14px;
|
|
||||||
font-weight: 300;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.supported-logs-type-container {
|
|
||||||
display: flex;
|
|
||||||
flex-wrap: wrap;
|
|
||||||
gap: 24px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.supported-logs-type {
|
|
||||||
display: flex;
|
|
||||||
justify-content: center;
|
|
||||||
align-items: flex-start;
|
|
||||||
flex-direction: column;
|
|
||||||
gap: 16px;
|
|
||||||
width: 300px;
|
|
||||||
padding: 16px;
|
|
||||||
box-sizing: border-box;
|
|
||||||
height: 120px;
|
|
||||||
background: #1d1d1d;
|
|
||||||
border: 1px solid #424242;
|
|
||||||
border-radius: 3px;
|
|
||||||
color: #e5e7eb;
|
|
||||||
cursor: pointer;
|
|
||||||
|
|
||||||
&.selected {
|
|
||||||
background-color: #111a2c;
|
|
||||||
border: 0.5px solid #3c89e8;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.supported-logs-type-img {
|
|
||||||
height: 36px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.selected-logs-type-setup-instructions {
|
|
||||||
padding: 24px 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
div[class*='-setup-instructions-container'] {
|
|
||||||
.header {
|
|
||||||
display: flex;
|
|
||||||
align-items: flex-start;
|
|
||||||
gap: 12px;
|
|
||||||
|
|
||||||
margin: 16px 0;
|
|
||||||
|
|
||||||
img {
|
|
||||||
height: 32px;
|
|
||||||
min-height: 32px;
|
|
||||||
min-width: 32px;
|
|
||||||
}
|
|
||||||
|
|
||||||
h1 {
|
|
||||||
font-size: 18px;
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
color: #e5e7eb;
|
|
||||||
gap: 16px;
|
|
||||||
margin: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.label {
|
|
||||||
font-size: 14px;
|
|
||||||
margin-bottom: 8px;
|
|
||||||
font-weight: 300;
|
|
||||||
}
|
|
||||||
|
|
||||||
pre {
|
|
||||||
background-color: #292d3e;
|
|
||||||
padding: 8px;
|
|
||||||
overflow: auto;
|
|
||||||
border-radius: 3px;
|
|
||||||
|
|
||||||
code {
|
|
||||||
overflow: auto;
|
|
||||||
text-wrap: wrap;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.content-container {
|
|
||||||
padding: 24px;
|
|
||||||
margin: 16px 0;
|
|
||||||
background: rgba(29, 29, 29, 1);
|
|
||||||
line-height: 20px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.detailed-docs-link {
|
|
||||||
display: flex;
|
|
||||||
margin: 8px 0;
|
|
||||||
font-size: 12px;
|
|
||||||
|
|
||||||
a {
|
|
||||||
padding-left: 4px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.language-tab-item {
|
|
||||||
display: flex;
|
|
||||||
justify-content: center;
|
|
||||||
align-items: center;
|
|
||||||
|
|
||||||
img {
|
|
||||||
height: 28px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$lightModeFontColor: rgb(29, 29, 29);
|
|
||||||
|
|
||||||
.lightMode {
|
|
||||||
.logs-management-module-container {
|
|
||||||
.header {
|
|
||||||
color: $lightModeFontColor;
|
|
||||||
}
|
|
||||||
|
|
||||||
div[class*='-setup-instructions-container'] {
|
|
||||||
.header {
|
|
||||||
h1 {
|
|
||||||
color: $lightModeFontColor;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.framework-selector {
|
|
||||||
.label {
|
|
||||||
color: $lightModeFontColor;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.service-name-container {
|
|
||||||
.label {
|
|
||||||
color: $lightModeFontColor;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,130 +0,0 @@
|
|||||||
/* eslint-disable jsx-a11y/no-static-element-interactions */
|
|
||||||
/* eslint-disable @typescript-eslint/explicit-function-return-type */
|
|
||||||
/* eslint-disable jsx-a11y/click-events-have-key-events */
|
|
||||||
import './LogsManagement.styles.scss';
|
|
||||||
|
|
||||||
import cx from 'classnames';
|
|
||||||
import { useEffect, useState } from 'react';
|
|
||||||
import { trackEvent } from 'utils/segmentAnalytics';
|
|
||||||
|
|
||||||
import ApplicationLogs from './ApplicationLogs/ApplicationLogs';
|
|
||||||
import Docker from './Docker/Docker';
|
|
||||||
import ExistingCollectors from './ExistingCollectors/ExistingCollectors';
|
|
||||||
import Kubernetes from './Kubernetes/Kubernetes';
|
|
||||||
import Nodejs from './Nodejs/Nodejs';
|
|
||||||
import SysLogs from './SysLogs/SysLogs';
|
|
||||||
|
|
||||||
const supportedLogTypes = [
|
|
||||||
{
|
|
||||||
name: 'Kubernetes Pod Logs',
|
|
||||||
id: 'kubernetes',
|
|
||||||
imgURL: `Logos/kubernetes.svg`,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'Docker Container Logs',
|
|
||||||
id: 'docker',
|
|
||||||
imgURL: `Logos/docker.svg`,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'SysLogs',
|
|
||||||
id: 'syslogs',
|
|
||||||
imgURL: `Logos/syslogs.svg`,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'Application Logs',
|
|
||||||
id: 'application_logs_log_file',
|
|
||||||
imgURL: `Logos/software-window.svg`,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'Logs from existing collectors',
|
|
||||||
id: 'existing_collectors',
|
|
||||||
imgURL: `Logos/cmd-terminal.svg`,
|
|
||||||
},
|
|
||||||
];
|
|
||||||
|
|
||||||
export default function LogsManagement({
|
|
||||||
activeStep,
|
|
||||||
handleLogTypeSelect,
|
|
||||||
}: {
|
|
||||||
activeStep: number;
|
|
||||||
handleLogTypeSelect: (id: string) => any;
|
|
||||||
}): JSX.Element {
|
|
||||||
const [selectedLogsType, setSelectedLogsType] = useState('kubernetes');
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
// on language select
|
|
||||||
trackEvent('Onboarding: Logs Management', {
|
|
||||||
selectedLogsType,
|
|
||||||
activeStep,
|
|
||||||
});
|
|
||||||
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
||||||
}, [selectedLogsType]);
|
|
||||||
|
|
||||||
const renderSelectedLanguageSetupInstructions = ():
|
|
||||||
| JSX.Element
|
|
||||||
| undefined => {
|
|
||||||
switch (selectedLogsType) {
|
|
||||||
case 'kubernetes':
|
|
||||||
return <Kubernetes activeStep={activeStep} />;
|
|
||||||
case 'docker':
|
|
||||||
return <Docker activeStep={activeStep} />;
|
|
||||||
case 'application_logs_log_file':
|
|
||||||
return <ApplicationLogs type="from-log-file" activeStep={activeStep} />;
|
|
||||||
case 'application_logs_otel_sdk':
|
|
||||||
return <ApplicationLogs type="using-otel-sdk" activeStep={activeStep} />;
|
|
||||||
case 'syslogs':
|
|
||||||
return <SysLogs activeStep={activeStep} />;
|
|
||||||
case 'nodejs':
|
|
||||||
return <Nodejs activeStep={activeStep} />;
|
|
||||||
case 'existing_collectors':
|
|
||||||
return <ExistingCollectors />;
|
|
||||||
default:
|
|
||||||
return <> </>;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
return (
|
|
||||||
<div className="logs-management-module-container">
|
|
||||||
{activeStep === 2 && (
|
|
||||||
<>
|
|
||||||
<div className="header">
|
|
||||||
<h1>Select a Logs type</h1>
|
|
||||||
<h4> Choose the logs that you want to receive on SigNoz </h4>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div className="supported-logs-type-container">
|
|
||||||
{supportedLogTypes.map((logType) => (
|
|
||||||
<div
|
|
||||||
className={cx(
|
|
||||||
'supported-logs-type',
|
|
||||||
selectedLogsType === logType.id ? 'selected' : '',
|
|
||||||
)}
|
|
||||||
key={logType.name}
|
|
||||||
onClick={() => {
|
|
||||||
handleLogTypeSelect(logType.id);
|
|
||||||
setSelectedLogsType(logType.id);
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<img
|
|
||||||
className={cx('supported-logs-type-img')}
|
|
||||||
src={`${logType.imgURL}`}
|
|
||||||
alt=""
|
|
||||||
/>
|
|
||||||
|
|
||||||
<div> {logType.name} </div>
|
|
||||||
</div>
|
|
||||||
))}
|
|
||||||
</div>
|
|
||||||
</>
|
|
||||||
)}
|
|
||||||
|
|
||||||
{selectedLogsType && (
|
|
||||||
<div
|
|
||||||
className={cx('selected-logs-type-setup-instructions', selectedLogsType)}
|
|
||||||
>
|
|
||||||
{renderSelectedLanguageSetupInstructions()}
|
|
||||||
</div>
|
|
||||||
)}
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
}
|
|
@ -1,44 +0,0 @@
|
|||||||
import { Code, Pre } from 'components/MarkdownRenderer/MarkdownRenderer';
|
|
||||||
import Header from 'container/OnboardingContainer/common/Header/Header';
|
|
||||||
import ReactMarkdown from 'react-markdown';
|
|
||||||
|
|
||||||
import ConnectionStatus from '../common/LogsConnectionStatus/LogsConnectionStatus';
|
|
||||||
import NodeJsDocs from './nodejs.md';
|
|
||||||
|
|
||||||
export default function Nodejs({
|
|
||||||
activeStep,
|
|
||||||
}: {
|
|
||||||
activeStep: number;
|
|
||||||
}): JSX.Element {
|
|
||||||
return (
|
|
||||||
<>
|
|
||||||
{activeStep === 2 && (
|
|
||||||
<div className="golang-setup-instructions-container">
|
|
||||||
<Header
|
|
||||||
entity="nodejs"
|
|
||||||
heading="Collecting NodeJS winston logs"
|
|
||||||
imgURL="/Logos/node-js.svg"
|
|
||||||
docsURL="https://signoz.io/docs/userguide/collecting_nodejs_winston_logs/"
|
|
||||||
imgClassName="supported-logs-type-img"
|
|
||||||
/>
|
|
||||||
|
|
||||||
<div className="content-container">
|
|
||||||
<ReactMarkdown
|
|
||||||
components={{
|
|
||||||
pre: Pre,
|
|
||||||
code: Code,
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
{NodeJsDocs}
|
|
||||||
</ReactMarkdown>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
)}
|
|
||||||
{activeStep === 3 && (
|
|
||||||
<div className="connection-status-container">
|
|
||||||
<ConnectionStatus logType="nodejs" />
|
|
||||||
</div>
|
|
||||||
)}
|
|
||||||
</>
|
|
||||||
);
|
|
||||||
}
|
|
@ -1,44 +0,0 @@
|
|||||||
import { Code, Pre } from 'components/MarkdownRenderer/MarkdownRenderer';
|
|
||||||
import Header from 'container/OnboardingContainer/common/Header/Header';
|
|
||||||
import ReactMarkdown from 'react-markdown';
|
|
||||||
|
|
||||||
import ConnectionStatus from '../common/LogsConnectionStatus/LogsConnectionStatus';
|
|
||||||
import SysLogsDocs from './syslogs.md';
|
|
||||||
|
|
||||||
export default function SysLogs({
|
|
||||||
activeStep,
|
|
||||||
}: {
|
|
||||||
activeStep: number;
|
|
||||||
}): JSX.Element {
|
|
||||||
return (
|
|
||||||
<>
|
|
||||||
{activeStep === 2 && (
|
|
||||||
<div className="golang-setup-instructions-container">
|
|
||||||
<Header
|
|
||||||
entity="syslogs"
|
|
||||||
heading="Collecting Syslogs"
|
|
||||||
imgURL="/Logos/syslogs.svg"
|
|
||||||
docsURL="https://signoz.io/docs/userguide/collecting_syslogs/"
|
|
||||||
imgClassName="supported-logs-type-img"
|
|
||||||
/>
|
|
||||||
|
|
||||||
<div className="content-container">
|
|
||||||
<ReactMarkdown
|
|
||||||
components={{
|
|
||||||
pre: Pre,
|
|
||||||
code: Code,
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
{SysLogsDocs}
|
|
||||||
</ReactMarkdown>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
)}
|
|
||||||
{activeStep === 3 && (
|
|
||||||
<div className="connection-status-container">
|
|
||||||
<ConnectionStatus logType="syslogs" />
|
|
||||||
</div>
|
|
||||||
)}
|
|
||||||
</>
|
|
||||||
);
|
|
||||||
}
|
|
@ -0,0 +1,21 @@
|
|||||||
|
### Install otel-collector in your Kubernetes infra
|
||||||
|
|
||||||
|
Add the SigNoz Helm Chart repository
|
||||||
|
```bash
|
||||||
|
helm repo add signoz https://charts.signoz.io
|
||||||
|
```
|
||||||
|
|
||||||
|
If the chart is already present, update the chart to the latest using:
|
||||||
|
```bash
|
||||||
|
helm repo update
|
||||||
|
```
|
||||||
|
|
||||||
|
Install the Kubernetes Infrastructure chart provided by SigNoz
|
||||||
|
```bash
|
||||||
|
helm install my-release signoz/k8s-infra \
|
||||||
|
--set otelCollectorEndpoint=ingest.{{REGION}}.signoz.cloud:443 \
|
||||||
|
--set otelInsecure=false \
|
||||||
|
--set signozApiKey={{SIGNOZ_INGESTION_KEY}} \
|
||||||
|
--set global.clusterName=<CLUSTER_NAME>
|
||||||
|
```
|
||||||
|
- Replace `<CLUSTER_NAME>` with the name of the Kubernetes cluster or a unique identifier of the cluster.
|
@ -0,0 +1,116 @@
|
|||||||
|
After setting up the Otel collector agent, follow the steps below to instrumnet your Go Application
|
||||||
|
|
||||||
|
### Step 1: Install OpenTelemetry Dependencies
|
||||||
|
Dependencies related to OpenTelemetry exporter and SDK have to be installed first
|
||||||
|
|
||||||
|
Run the below commands after navigating to the application source folder:
|
||||||
|
```bash
|
||||||
|
go get go.opentelemetry.io/otel \
|
||||||
|
go.opentelemetry.io/otel/trace \
|
||||||
|
go.opentelemetry.io/otel/sdk \
|
||||||
|
go.opentelemetry.io/contrib/instrumentation/github.com/gin-gonic/gin/otelgin \
|
||||||
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace \
|
||||||
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc
|
||||||
|
```
|
||||||
|
|
||||||
|
**Note:** Note that we are assuming you are using gin request router. If you are using other request routers, check out the [corresponding package](https://signoz.io/docs/instrumentation/golang/#request-routers).
|
||||||
|
|
||||||
|
### Step 2: Declare environment variables for configuring OpenTelemetry
|
||||||
|
Declare the following global variables in **`main.go`** which we will use to configure OpenTelemetry:
|
||||||
|
```bash
|
||||||
|
var (
|
||||||
|
serviceName = os.Getenv("SERVICE_NAME")
|
||||||
|
collectorURL = os.Getenv("OTEL_EXPORTER_OTLP_ENDPOINT")
|
||||||
|
insecure = os.Getenv("INSECURE_MODE")
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
### Step 3: Instrument your Go application
|
||||||
|
To configure your application to send data we will need a function to initialize OpenTelemetry. Add the following snippet of code in your `main.go` file.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
|
||||||
|
import (
|
||||||
|
.....
|
||||||
|
|
||||||
|
"github.com/gin-gonic/gin"
|
||||||
|
"go.opentelemetry.io/otel"
|
||||||
|
"go.opentelemetry.io/otel/attribute"
|
||||||
|
"go.opentelemetry.io/otel/exporters/otlp/otlptrace"
|
||||||
|
"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc"
|
||||||
|
|
||||||
|
"go.opentelemetry.io/otel/sdk/resource"
|
||||||
|
sdktrace "go.opentelemetry.io/otel/sdk/trace"
|
||||||
|
)
|
||||||
|
|
||||||
|
func initTracer() func(context.Context) error {
|
||||||
|
|
||||||
|
var secureOption otlptracegrpc.Option
|
||||||
|
|
||||||
|
if strings.ToLower(insecure) == "false" || insecure == "0" || strings.ToLower(insecure) == "f" {
|
||||||
|
secureOption = otlptracegrpc.WithTLSCredentials(credentials.NewClientTLSFromCert(nil, ""))
|
||||||
|
} else {
|
||||||
|
secureOption = otlptracegrpc.WithInsecure()
|
||||||
|
}
|
||||||
|
|
||||||
|
exporter, err := otlptrace.New(
|
||||||
|
context.Background(),
|
||||||
|
otlptracegrpc.NewClient(
|
||||||
|
secureOption,
|
||||||
|
otlptracegrpc.WithEndpoint(collectorURL),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalf("Failed to create exporter: %v", err)
|
||||||
|
}
|
||||||
|
resources, err := resource.New(
|
||||||
|
context.Background(),
|
||||||
|
resource.WithAttributes(
|
||||||
|
attribute.String("service.name", serviceName),
|
||||||
|
attribute.String("library.language", "go"),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalf("Could not set resources: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
otel.SetTracerProvider(
|
||||||
|
sdktrace.NewTracerProvider(
|
||||||
|
sdktrace.WithSampler(sdktrace.AlwaysSample()),
|
||||||
|
sdktrace.WithBatcher(exporter),
|
||||||
|
sdktrace.WithResource(resources),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
return exporter.Shutdown
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Step 4: Initialise the tracer in `main.go`
|
||||||
|
Modify the main function to initialise the tracer in main.go. Initiate the tracer at the very beginning of our main function.
|
||||||
|
```bash
|
||||||
|
func main() {
|
||||||
|
cleanup := initTracer()
|
||||||
|
defer cleanup(context.Background())
|
||||||
|
|
||||||
|
......
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Step 5: Add the OpenTelemetry Gin middleware
|
||||||
|
Configure Gin to use the middleware by adding the following lines in `main.go`
|
||||||
|
```bash
|
||||||
|
import (
|
||||||
|
....
|
||||||
|
"go.opentelemetry.io/contrib/instrumentation/github.com/gin-gonic/gin/otelgin"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
......
|
||||||
|
r := gin.Default()
|
||||||
|
r.Use(otelgin.Middleware(serviceName))
|
||||||
|
......
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
@ -0,0 +1,5 @@
|
|||||||
|
To run your Go Gin application, use the below command :
|
||||||
|
|
||||||
|
```bash
|
||||||
|
SERVICE_NAME={{MYAPP}} INSECURE_MODE=true OTEL_EXPORTER_OTLP_ENDPOINT=localhost:4317 go run main.go
|
||||||
|
```
|
@ -0,0 +1,115 @@
|
|||||||
|
|
||||||
|
### Step 1: Install OpenTelemetry Dependencies
|
||||||
|
Dependencies related to OpenTelemetry exporter and SDK have to be installed first
|
||||||
|
|
||||||
|
Run the below commands after navigating to the application source folder:
|
||||||
|
```bash
|
||||||
|
go get go.opentelemetry.io/otel \
|
||||||
|
go.opentelemetry.io/otel/trace \
|
||||||
|
go.opentelemetry.io/otel/sdk \
|
||||||
|
go.opentelemetry.io/contrib/instrumentation/github.com/gin-gonic/gin/otelgin \
|
||||||
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace \
|
||||||
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc
|
||||||
|
```
|
||||||
|
|
||||||
|
**Note:** Note that we are assuming you are using gin request router. If you are using other request routers, check out the [corresponding package](https://signoz.io/docs/instrumentation/golang/#request-routers).
|
||||||
|
|
||||||
|
### Step 2: Declare environment variables for configuring OpenTelemetry
|
||||||
|
Declare the following global variables in **`main.go`** which we will use to configure OpenTelemetry:
|
||||||
|
```bash
|
||||||
|
var (
|
||||||
|
serviceName = os.Getenv("SERVICE_NAME")
|
||||||
|
collectorURL = os.Getenv("OTEL_EXPORTER_OTLP_ENDPOINT")
|
||||||
|
insecure = os.Getenv("INSECURE_MODE")
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
### Step 3: Instrument your Go application
|
||||||
|
To configure your application to send data we will need a function to initialize OpenTelemetry. Add the following snippet of code in your `main.go` file.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
|
||||||
|
import (
|
||||||
|
.....
|
||||||
|
|
||||||
|
"github.com/gin-gonic/gin"
|
||||||
|
"go.opentelemetry.io/otel"
|
||||||
|
"go.opentelemetry.io/otel/attribute"
|
||||||
|
"go.opentelemetry.io/otel/exporters/otlp/otlptrace"
|
||||||
|
"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc"
|
||||||
|
|
||||||
|
"go.opentelemetry.io/otel/sdk/resource"
|
||||||
|
sdktrace "go.opentelemetry.io/otel/sdk/trace"
|
||||||
|
)
|
||||||
|
|
||||||
|
func initTracer() func(context.Context) error {
|
||||||
|
|
||||||
|
var secureOption otlptracegrpc.Option
|
||||||
|
|
||||||
|
if strings.ToLower(insecure) == "false" || insecure == "0" || strings.ToLower(insecure) == "f" {
|
||||||
|
secureOption = otlptracegrpc.WithTLSCredentials(credentials.NewClientTLSFromCert(nil, ""))
|
||||||
|
} else {
|
||||||
|
secureOption = otlptracegrpc.WithInsecure()
|
||||||
|
}
|
||||||
|
|
||||||
|
exporter, err := otlptrace.New(
|
||||||
|
context.Background(),
|
||||||
|
otlptracegrpc.NewClient(
|
||||||
|
secureOption,
|
||||||
|
otlptracegrpc.WithEndpoint(collectorURL),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalf("Failed to create exporter: %v", err)
|
||||||
|
}
|
||||||
|
resources, err := resource.New(
|
||||||
|
context.Background(),
|
||||||
|
resource.WithAttributes(
|
||||||
|
attribute.String("service.name", serviceName),
|
||||||
|
attribute.String("library.language", "go"),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalf("Could not set resources: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
otel.SetTracerProvider(
|
||||||
|
sdktrace.NewTracerProvider(
|
||||||
|
sdktrace.WithSampler(sdktrace.AlwaysSample()),
|
||||||
|
sdktrace.WithBatcher(exporter),
|
||||||
|
sdktrace.WithResource(resources),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
return exporter.Shutdown
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Step 4: Initialise the tracer in `main.go`
|
||||||
|
Modify the main function to initialise the tracer in main.go. Initiate the tracer at the very beginning of our main function.
|
||||||
|
```bash
|
||||||
|
func main() {
|
||||||
|
cleanup := initTracer()
|
||||||
|
defer cleanup(context.Background())
|
||||||
|
|
||||||
|
......
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Step 5: Add the OpenTelemetry Gin middleware
|
||||||
|
Configure Gin to use the middleware by adding the following lines in `main.go`
|
||||||
|
```bash
|
||||||
|
import (
|
||||||
|
....
|
||||||
|
"go.opentelemetry.io/contrib/instrumentation/github.com/gin-gonic/gin/otelgin"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
......
|
||||||
|
r := gin.Default()
|
||||||
|
r.Use(otelgin.Middleware(serviceName))
|
||||||
|
......
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
@ -0,0 +1,5 @@
|
|||||||
|
To run your Go Gin application, use the below command :
|
||||||
|
|
||||||
|
```bash
|
||||||
|
SERVICE_NAME={{MYAPP}} INSECURE_MODE=false OTEL_EXPORTER_OTLP_HEADERS=signoz-access-token={{SIGNOZ_INGESTION_KEY}} OTEL_EXPORTER_OTLP_ENDPOINT=ingest.{{REGION}}.signoz.cloud:443 go run main.go
|
||||||
|
```
|
@ -0,0 +1,93 @@
|
|||||||
|
### Setup OpenTelemetry Binary as an agent
|
||||||
|
|
||||||
|
### Step 1: Download otel-collector tar.gz
|
||||||
|
```bash
|
||||||
|
wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_linux_amd64.tar.gz
|
||||||
|
```
|
||||||
|
|
||||||
|
### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder
|
||||||
|
```bash
|
||||||
|
mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_linux_amd64.tar.gz -C otelcol-contrib
|
||||||
|
```
|
||||||
|
|
||||||
|
### Step 3: Create config.yaml in folder otelcol-contrib with the below content in it
|
||||||
|
```bash
|
||||||
|
receivers:
|
||||||
|
otlp:
|
||||||
|
protocols:
|
||||||
|
grpc:
|
||||||
|
endpoint: 0.0.0.0:4317
|
||||||
|
http:
|
||||||
|
endpoint: 0.0.0.0:4318
|
||||||
|
hostmetrics:
|
||||||
|
collection_interval: 60s
|
||||||
|
scrapers:
|
||||||
|
cpu: {}
|
||||||
|
disk: {}
|
||||||
|
load: {}
|
||||||
|
filesystem: {}
|
||||||
|
memory: {}
|
||||||
|
network: {}
|
||||||
|
paging: {}
|
||||||
|
process:
|
||||||
|
mute_process_name_error: true
|
||||||
|
mute_process_exe_error: true
|
||||||
|
mute_process_io_error: true
|
||||||
|
processes: {}
|
||||||
|
prometheus:
|
||||||
|
config:
|
||||||
|
global:
|
||||||
|
scrape_interval: 60s
|
||||||
|
scrape_configs:
|
||||||
|
- job_name: otel-collector-binary
|
||||||
|
static_configs:
|
||||||
|
- targets:
|
||||||
|
# - localhost:8888
|
||||||
|
processors:
|
||||||
|
batch:
|
||||||
|
send_batch_size: 1000
|
||||||
|
timeout: 10s
|
||||||
|
# Ref: https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/processor/resourcedetectionprocessor/README.md
|
||||||
|
resourcedetection:
|
||||||
|
detectors: [env, system] # Before system detector, include ec2 for AWS, gcp for GCP and azure for Azure.
|
||||||
|
# Using OTEL_RESOURCE_ATTRIBUTES envvar, env detector adds custom labels.
|
||||||
|
timeout: 2s
|
||||||
|
system:
|
||||||
|
hostname_sources: [os] # alternatively, use [dns,os] for setting FQDN as host.name and os as fallback
|
||||||
|
extensions:
|
||||||
|
health_check: {}
|
||||||
|
zpages: {}
|
||||||
|
exporters:
|
||||||
|
otlp:
|
||||||
|
endpoint: "ingest.{{REGION}}.signoz.cloud:443"
|
||||||
|
tls:
|
||||||
|
insecure: false
|
||||||
|
headers:
|
||||||
|
"signoz-access-token": "{{SIGNOZ_INGESTION_KEY}}"
|
||||||
|
logging:
|
||||||
|
verbosity: normal
|
||||||
|
service:
|
||||||
|
telemetry:
|
||||||
|
metrics:
|
||||||
|
address: 0.0.0.0:8888
|
||||||
|
extensions: [health_check, zpages]
|
||||||
|
pipelines:
|
||||||
|
metrics:
|
||||||
|
receivers: [otlp]
|
||||||
|
processors: [batch]
|
||||||
|
exporters: [otlp]
|
||||||
|
metrics/internal:
|
||||||
|
receivers: [prometheus, hostmetrics]
|
||||||
|
processors: [resourcedetection, batch]
|
||||||
|
exporters: [otlp]
|
||||||
|
traces:
|
||||||
|
receivers: [otlp]
|
||||||
|
processors: [batch]
|
||||||
|
exporters: [otlp]
|
||||||
|
logs:
|
||||||
|
receivers: [otlp]
|
||||||
|
processors: [batch]
|
||||||
|
exporters: [otlp]
|
||||||
|
```
|
||||||
|
|
||||||
|
|
@ -0,0 +1,116 @@
|
|||||||
|
After setting up the Otel collector agent, follow the steps below to instrumnet your Go Application
|
||||||
|
|
||||||
|
### Step 1: Install OpenTelemetry Dependencies
|
||||||
|
Dependencies related to OpenTelemetry exporter and SDK have to be installed first
|
||||||
|
|
||||||
|
Run the below commands after navigating to the application source folder:
|
||||||
|
```bash
|
||||||
|
go get go.opentelemetry.io/otel \
|
||||||
|
go.opentelemetry.io/otel/trace \
|
||||||
|
go.opentelemetry.io/otel/sdk \
|
||||||
|
go.opentelemetry.io/contrib/instrumentation/github.com/gin-gonic/gin/otelgin \
|
||||||
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace \
|
||||||
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc
|
||||||
|
```
|
||||||
|
|
||||||
|
**Note:** Note that we are assuming you are using gin request router. If you are using other request routers, check out the [corresponding package](https://signoz.io/docs/instrumentation/golang/#request-routers).
|
||||||
|
|
||||||
|
### Step 2: Declare environment variables for configuring OpenTelemetry
|
||||||
|
Declare the following global variables in **`main.go`** which we will use to configure OpenTelemetry:
|
||||||
|
```bash
|
||||||
|
var (
|
||||||
|
serviceName = os.Getenv("SERVICE_NAME")
|
||||||
|
collectorURL = os.Getenv("OTEL_EXPORTER_OTLP_ENDPOINT")
|
||||||
|
insecure = os.Getenv("INSECURE_MODE")
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
### Step 3: Instrument your Go application
|
||||||
|
To configure your application to send data we will need a function to initialize OpenTelemetry. Add the following snippet of code in your `main.go` file.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
|
||||||
|
import (
|
||||||
|
.....
|
||||||
|
|
||||||
|
"github.com/gin-gonic/gin"
|
||||||
|
"go.opentelemetry.io/otel"
|
||||||
|
"go.opentelemetry.io/otel/attribute"
|
||||||
|
"go.opentelemetry.io/otel/exporters/otlp/otlptrace"
|
||||||
|
"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc"
|
||||||
|
|
||||||
|
"go.opentelemetry.io/otel/sdk/resource"
|
||||||
|
sdktrace "go.opentelemetry.io/otel/sdk/trace"
|
||||||
|
)
|
||||||
|
|
||||||
|
func initTracer() func(context.Context) error {
|
||||||
|
|
||||||
|
var secureOption otlptracegrpc.Option
|
||||||
|
|
||||||
|
if strings.ToLower(insecure) == "false" || insecure == "0" || strings.ToLower(insecure) == "f" {
|
||||||
|
secureOption = otlptracegrpc.WithTLSCredentials(credentials.NewClientTLSFromCert(nil, ""))
|
||||||
|
} else {
|
||||||
|
secureOption = otlptracegrpc.WithInsecure()
|
||||||
|
}
|
||||||
|
|
||||||
|
exporter, err := otlptrace.New(
|
||||||
|
context.Background(),
|
||||||
|
otlptracegrpc.NewClient(
|
||||||
|
secureOption,
|
||||||
|
otlptracegrpc.WithEndpoint(collectorURL),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalf("Failed to create exporter: %v", err)
|
||||||
|
}
|
||||||
|
resources, err := resource.New(
|
||||||
|
context.Background(),
|
||||||
|
resource.WithAttributes(
|
||||||
|
attribute.String("service.name", serviceName),
|
||||||
|
attribute.String("library.language", "go"),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalf("Could not set resources: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
otel.SetTracerProvider(
|
||||||
|
sdktrace.NewTracerProvider(
|
||||||
|
sdktrace.WithSampler(sdktrace.AlwaysSample()),
|
||||||
|
sdktrace.WithBatcher(exporter),
|
||||||
|
sdktrace.WithResource(resources),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
return exporter.Shutdown
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Step 4: Initialise the tracer in `main.go`
|
||||||
|
Modify the main function to initialise the tracer in main.go. Initiate the tracer at the very beginning of our main function.
|
||||||
|
```bash
|
||||||
|
func main() {
|
||||||
|
cleanup := initTracer()
|
||||||
|
defer cleanup(context.Background())
|
||||||
|
|
||||||
|
......
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Step 5: Add the OpenTelemetry Gin middleware
|
||||||
|
Configure Gin to use the middleware by adding the following lines in `main.go`
|
||||||
|
```bash
|
||||||
|
import (
|
||||||
|
....
|
||||||
|
"go.opentelemetry.io/contrib/instrumentation/github.com/gin-gonic/gin/otelgin"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
......
|
||||||
|
r := gin.Default()
|
||||||
|
r.Use(otelgin.Middleware(serviceName))
|
||||||
|
......
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
@ -0,0 +1,21 @@
|
|||||||
|
Once you are done intrumenting your Go Gin application, you can run it using the below commands
|
||||||
|
|
||||||
|
### Step 1: Run OTel Collector
|
||||||
|
Run this command inside the `otelcol-contrib` directory that you created in the install Otel Collector step
|
||||||
|
|
||||||
|
```bash
|
||||||
|
./otelcol-contrib --config ./config.yaml &> otelcol-output.log & echo "$!" > otel-pid
|
||||||
|
```
|
||||||
|
### (Optional Step): View last 50 lines of `otelcol` logs
|
||||||
|
```bash
|
||||||
|
tail -f -n 50 otelcol-output.log
|
||||||
|
```
|
||||||
|
|
||||||
|
### (Optional Step): Stop `otelcol`
|
||||||
|
```bash
|
||||||
|
kill "$(< otel-pid)"
|
||||||
|
```
|
||||||
|
### Step 2: Set environment variables and run your Go Gin application
|
||||||
|
```bash
|
||||||
|
SERVICE_NAME={{MYAPP}} INSECURE_MODE=true OTEL_EXPORTER_OTLP_ENDPOINT=localhost:4317 go run main.go
|
||||||
|
```
|
@ -0,0 +1,115 @@
|
|||||||
|
|
||||||
|
### Step 1: Install OpenTelemetry Dependencies
|
||||||
|
Dependencies related to OpenTelemetry exporter and SDK have to be installed first
|
||||||
|
|
||||||
|
Run the below commands after navigating to the application source folder:
|
||||||
|
```bash
|
||||||
|
go get go.opentelemetry.io/otel \
|
||||||
|
go.opentelemetry.io/otel/trace \
|
||||||
|
go.opentelemetry.io/otel/sdk \
|
||||||
|
go.opentelemetry.io/contrib/instrumentation/github.com/gin-gonic/gin/otelgin \
|
||||||
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace \
|
||||||
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc
|
||||||
|
```
|
||||||
|
|
||||||
|
**Note:** Note that we are assuming you are using gin request router. If you are using other request routers, check out the [corresponding package](https://signoz.io/docs/instrumentation/golang/#request-routers).
|
||||||
|
|
||||||
|
### Step 2: Declare environment variables for configuring OpenTelemetry
|
||||||
|
Declare the following global variables in **`main.go`** which we will use to configure OpenTelemetry:
|
||||||
|
```bash
|
||||||
|
var (
|
||||||
|
serviceName = os.Getenv("SERVICE_NAME")
|
||||||
|
collectorURL = os.Getenv("OTEL_EXPORTER_OTLP_ENDPOINT")
|
||||||
|
insecure = os.Getenv("INSECURE_MODE")
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
### Step 3: Instrument your Go application
|
||||||
|
To configure your application to send data we will need a function to initialize OpenTelemetry. Add the following snippet of code in your `main.go` file.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
|
||||||
|
import (
|
||||||
|
.....
|
||||||
|
|
||||||
|
"github.com/gin-gonic/gin"
|
||||||
|
"go.opentelemetry.io/otel"
|
||||||
|
"go.opentelemetry.io/otel/attribute"
|
||||||
|
"go.opentelemetry.io/otel/exporters/otlp/otlptrace"
|
||||||
|
"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc"
|
||||||
|
|
||||||
|
"go.opentelemetry.io/otel/sdk/resource"
|
||||||
|
sdktrace "go.opentelemetry.io/otel/sdk/trace"
|
||||||
|
)
|
||||||
|
|
||||||
|
func initTracer() func(context.Context) error {
|
||||||
|
|
||||||
|
var secureOption otlptracegrpc.Option
|
||||||
|
|
||||||
|
if strings.ToLower(insecure) == "false" || insecure == "0" || strings.ToLower(insecure) == "f" {
|
||||||
|
secureOption = otlptracegrpc.WithTLSCredentials(credentials.NewClientTLSFromCert(nil, ""))
|
||||||
|
} else {
|
||||||
|
secureOption = otlptracegrpc.WithInsecure()
|
||||||
|
}
|
||||||
|
|
||||||
|
exporter, err := otlptrace.New(
|
||||||
|
context.Background(),
|
||||||
|
otlptracegrpc.NewClient(
|
||||||
|
secureOption,
|
||||||
|
otlptracegrpc.WithEndpoint(collectorURL),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalf("Failed to create exporter: %v", err)
|
||||||
|
}
|
||||||
|
resources, err := resource.New(
|
||||||
|
context.Background(),
|
||||||
|
resource.WithAttributes(
|
||||||
|
attribute.String("service.name", serviceName),
|
||||||
|
attribute.String("library.language", "go"),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalf("Could not set resources: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
otel.SetTracerProvider(
|
||||||
|
sdktrace.NewTracerProvider(
|
||||||
|
sdktrace.WithSampler(sdktrace.AlwaysSample()),
|
||||||
|
sdktrace.WithBatcher(exporter),
|
||||||
|
sdktrace.WithResource(resources),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
return exporter.Shutdown
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Step 4: Initialise the tracer in `main.go`
|
||||||
|
Modify the main function to initialise the tracer in main.go. Initiate the tracer at the very beginning of our main function.
|
||||||
|
```bash
|
||||||
|
func main() {
|
||||||
|
cleanup := initTracer()
|
||||||
|
defer cleanup(context.Background())
|
||||||
|
|
||||||
|
......
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Step 5: Add the OpenTelemetry Gin middleware
|
||||||
|
Configure Gin to use the middleware by adding the following lines in `main.go`
|
||||||
|
```bash
|
||||||
|
import (
|
||||||
|
....
|
||||||
|
"go.opentelemetry.io/contrib/instrumentation/github.com/gin-gonic/gin/otelgin"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
......
|
||||||
|
r := gin.Default()
|
||||||
|
r.Use(otelgin.Middleware(serviceName))
|
||||||
|
......
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
@ -0,0 +1,5 @@
|
|||||||
|
To run your Go Gin application, use the below command :
|
||||||
|
|
||||||
|
```bash
|
||||||
|
SERVICE_NAME={{MYAPP}} INSECURE_MODE=false OTEL_EXPORTER_OTLP_HEADERS=signoz-access-token={{SIGNOZ_INGESTION_KEY}} OTEL_EXPORTER_OTLP_ENDPOINT=ingest.{{REGION}}.signoz.cloud:443 go run main.go
|
||||||
|
```
|
@ -0,0 +1,93 @@
|
|||||||
|
### Setup OpenTelemetry Binary as an agent
|
||||||
|
|
||||||
|
### Step 1: Download otel-collector tar.gz
|
||||||
|
```bash
|
||||||
|
wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_linux_arm64.tar.gz
|
||||||
|
```
|
||||||
|
|
||||||
|
### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder
|
||||||
|
```bash
|
||||||
|
mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_linux_arm64.tar.gz -C otelcol-contrib
|
||||||
|
```
|
||||||
|
|
||||||
|
### Step 3: Create config.yaml in folder otelcol-contrib with the below content in it
|
||||||
|
```bash
|
||||||
|
receivers:
|
||||||
|
otlp:
|
||||||
|
protocols:
|
||||||
|
grpc:
|
||||||
|
endpoint: 0.0.0.0:4317
|
||||||
|
http:
|
||||||
|
endpoint: 0.0.0.0:4318
|
||||||
|
hostmetrics:
|
||||||
|
collection_interval: 60s
|
||||||
|
scrapers:
|
||||||
|
cpu: {}
|
||||||
|
disk: {}
|
||||||
|
load: {}
|
||||||
|
filesystem: {}
|
||||||
|
memory: {}
|
||||||
|
network: {}
|
||||||
|
paging: {}
|
||||||
|
process:
|
||||||
|
mute_process_name_error: true
|
||||||
|
mute_process_exe_error: true
|
||||||
|
mute_process_io_error: true
|
||||||
|
processes: {}
|
||||||
|
prometheus:
|
||||||
|
config:
|
||||||
|
global:
|
||||||
|
scrape_interval: 60s
|
||||||
|
scrape_configs:
|
||||||
|
- job_name: otel-collector-binary
|
||||||
|
static_configs:
|
||||||
|
- targets:
|
||||||
|
# - localhost:8888
|
||||||
|
processors:
|
||||||
|
batch:
|
||||||
|
send_batch_size: 1000
|
||||||
|
timeout: 10s
|
||||||
|
# Ref: https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/processor/resourcedetectionprocessor/README.md
|
||||||
|
resourcedetection:
|
||||||
|
detectors: [env, system] # Before system detector, include ec2 for AWS, gcp for GCP and azure for Azure.
|
||||||
|
# Using OTEL_RESOURCE_ATTRIBUTES envvar, env detector adds custom labels.
|
||||||
|
timeout: 2s
|
||||||
|
system:
|
||||||
|
hostname_sources: [os] # alternatively, use [dns,os] for setting FQDN as host.name and os as fallback
|
||||||
|
extensions:
|
||||||
|
health_check: {}
|
||||||
|
zpages: {}
|
||||||
|
exporters:
|
||||||
|
otlp:
|
||||||
|
endpoint: "ingest.{{REGION}}.signoz.cloud:443"
|
||||||
|
tls:
|
||||||
|
insecure: false
|
||||||
|
headers:
|
||||||
|
"signoz-access-token": "{{SIGNOZ_INGESTION_KEY}}"
|
||||||
|
logging:
|
||||||
|
verbosity: normal
|
||||||
|
service:
|
||||||
|
telemetry:
|
||||||
|
metrics:
|
||||||
|
address: 0.0.0.0:8888
|
||||||
|
extensions: [health_check, zpages]
|
||||||
|
pipelines:
|
||||||
|
metrics:
|
||||||
|
receivers: [otlp]
|
||||||
|
processors: [batch]
|
||||||
|
exporters: [otlp]
|
||||||
|
metrics/internal:
|
||||||
|
receivers: [prometheus, hostmetrics]
|
||||||
|
processors: [resourcedetection, batch]
|
||||||
|
exporters: [otlp]
|
||||||
|
traces:
|
||||||
|
receivers: [otlp]
|
||||||
|
processors: [batch]
|
||||||
|
exporters: [otlp]
|
||||||
|
logs:
|
||||||
|
receivers: [otlp]
|
||||||
|
processors: [batch]
|
||||||
|
exporters: [otlp]
|
||||||
|
```
|
||||||
|
|
||||||
|
|
@ -0,0 +1,116 @@
|
|||||||
|
After setting up the Otel collector agent, follow the steps below to instrumnet your Go Application
|
||||||
|
|
||||||
|
### Step 1: Install OpenTelemetry Dependencies
|
||||||
|
Dependencies related to OpenTelemetry exporter and SDK have to be installed first
|
||||||
|
|
||||||
|
Run the below commands after navigating to the application source folder:
|
||||||
|
```bash
|
||||||
|
go get go.opentelemetry.io/otel \
|
||||||
|
go.opentelemetry.io/otel/trace \
|
||||||
|
go.opentelemetry.io/otel/sdk \
|
||||||
|
go.opentelemetry.io/contrib/instrumentation/github.com/gin-gonic/gin/otelgin \
|
||||||
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace \
|
||||||
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc
|
||||||
|
```
|
||||||
|
|
||||||
|
**Note:** Note that we are assuming you are using gin request router. If you are using other request routers, check out the [corresponding package](https://signoz.io/docs/instrumentation/golang/#request-routers).
|
||||||
|
|
||||||
|
### Step 2: Declare environment variables for configuring OpenTelemetry
|
||||||
|
Declare the following global variables in **`main.go`** which we will use to configure OpenTelemetry:
|
||||||
|
```bash
|
||||||
|
var (
|
||||||
|
serviceName = os.Getenv("SERVICE_NAME")
|
||||||
|
collectorURL = os.Getenv("OTEL_EXPORTER_OTLP_ENDPOINT")
|
||||||
|
insecure = os.Getenv("INSECURE_MODE")
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
### Step 3: Instrument your Go application
|
||||||
|
To configure your application to send data we will need a function to initialize OpenTelemetry. Add the following snippet of code in your `main.go` file.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
|
||||||
|
import (
|
||||||
|
.....
|
||||||
|
|
||||||
|
"github.com/gin-gonic/gin"
|
||||||
|
"go.opentelemetry.io/otel"
|
||||||
|
"go.opentelemetry.io/otel/attribute"
|
||||||
|
"go.opentelemetry.io/otel/exporters/otlp/otlptrace"
|
||||||
|
"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc"
|
||||||
|
|
||||||
|
"go.opentelemetry.io/otel/sdk/resource"
|
||||||
|
sdktrace "go.opentelemetry.io/otel/sdk/trace"
|
||||||
|
)
|
||||||
|
|
||||||
|
func initTracer() func(context.Context) error {
|
||||||
|
|
||||||
|
var secureOption otlptracegrpc.Option
|
||||||
|
|
||||||
|
if strings.ToLower(insecure) == "false" || insecure == "0" || strings.ToLower(insecure) == "f" {
|
||||||
|
secureOption = otlptracegrpc.WithTLSCredentials(credentials.NewClientTLSFromCert(nil, ""))
|
||||||
|
} else {
|
||||||
|
secureOption = otlptracegrpc.WithInsecure()
|
||||||
|
}
|
||||||
|
|
||||||
|
exporter, err := otlptrace.New(
|
||||||
|
context.Background(),
|
||||||
|
otlptracegrpc.NewClient(
|
||||||
|
secureOption,
|
||||||
|
otlptracegrpc.WithEndpoint(collectorURL),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalf("Failed to create exporter: %v", err)
|
||||||
|
}
|
||||||
|
resources, err := resource.New(
|
||||||
|
context.Background(),
|
||||||
|
resource.WithAttributes(
|
||||||
|
attribute.String("service.name", serviceName),
|
||||||
|
attribute.String("library.language", "go"),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalf("Could not set resources: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
otel.SetTracerProvider(
|
||||||
|
sdktrace.NewTracerProvider(
|
||||||
|
sdktrace.WithSampler(sdktrace.AlwaysSample()),
|
||||||
|
sdktrace.WithBatcher(exporter),
|
||||||
|
sdktrace.WithResource(resources),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
return exporter.Shutdown
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Step 4: Initialise the tracer in `main.go`
|
||||||
|
Modify the main function to initialise the tracer in main.go. Initiate the tracer at the very beginning of our main function.
|
||||||
|
```bash
|
||||||
|
func main() {
|
||||||
|
cleanup := initTracer()
|
||||||
|
defer cleanup(context.Background())
|
||||||
|
|
||||||
|
......
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Step 5: Add the OpenTelemetry Gin middleware
|
||||||
|
Configure Gin to use the middleware by adding the following lines in `main.go`
|
||||||
|
```bash
|
||||||
|
import (
|
||||||
|
....
|
||||||
|
"go.opentelemetry.io/contrib/instrumentation/github.com/gin-gonic/gin/otelgin"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
......
|
||||||
|
r := gin.Default()
|
||||||
|
r.Use(otelgin.Middleware(serviceName))
|
||||||
|
......
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
@ -0,0 +1,21 @@
|
|||||||
|
Once you are done intrumenting your Go Gin application, you can run it using the below commands
|
||||||
|
|
||||||
|
### Step 1: Run OTel Collector
|
||||||
|
Run this command inside the `otelcol-contrib` directory that you created in the install Otel Collector step
|
||||||
|
|
||||||
|
```bash
|
||||||
|
./otelcol-contrib --config ./config.yaml &> otelcol-output.log & echo "$!" > otel-pid
|
||||||
|
```
|
||||||
|
### (Optional Step): View last 50 lines of `otelcol` logs
|
||||||
|
```bash
|
||||||
|
tail -f -n 50 otelcol-output.log
|
||||||
|
```
|
||||||
|
|
||||||
|
### (Optional Step): Stop `otelcol`
|
||||||
|
```bash
|
||||||
|
kill "$(< otel-pid)"
|
||||||
|
```
|
||||||
|
### Step 2: Set environment variables and run your Go Gin application
|
||||||
|
```bash
|
||||||
|
SERVICE_NAME={{MYAPP}} INSECURE_MODE=true OTEL_EXPORTER_OTLP_ENDPOINT=localhost:4317 go run main.go
|
||||||
|
```
|
@ -0,0 +1,115 @@
|
|||||||
|
|
||||||
|
### Step 1: Install OpenTelemetry Dependencies
|
||||||
|
Dependencies related to OpenTelemetry exporter and SDK have to be installed first
|
||||||
|
|
||||||
|
Run the below commands after navigating to the application source folder:
|
||||||
|
```bash
|
||||||
|
go get go.opentelemetry.io/otel \
|
||||||
|
go.opentelemetry.io/otel/trace \
|
||||||
|
go.opentelemetry.io/otel/sdk \
|
||||||
|
go.opentelemetry.io/contrib/instrumentation/github.com/gin-gonic/gin/otelgin \
|
||||||
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace \
|
||||||
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc
|
||||||
|
```
|
||||||
|
|
||||||
|
**Note:** Note that we are assuming you are using gin request router. If you are using other request routers, check out the [corresponding package](https://signoz.io/docs/instrumentation/golang/#request-routers).
|
||||||
|
|
||||||
|
### Step 2: Declare environment variables for configuring OpenTelemetry
|
||||||
|
Declare the following global variables in **`main.go`** which we will use to configure OpenTelemetry:
|
||||||
|
```bash
|
||||||
|
var (
|
||||||
|
serviceName = os.Getenv("SERVICE_NAME")
|
||||||
|
collectorURL = os.Getenv("OTEL_EXPORTER_OTLP_ENDPOINT")
|
||||||
|
insecure = os.Getenv("INSECURE_MODE")
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
### Step 3: Instrument your Go application
|
||||||
|
To configure your application to send data we will need a function to initialize OpenTelemetry. Add the following snippet of code in your `main.go` file.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
|
||||||
|
import (
|
||||||
|
.....
|
||||||
|
|
||||||
|
"github.com/gin-gonic/gin"
|
||||||
|
"go.opentelemetry.io/otel"
|
||||||
|
"go.opentelemetry.io/otel/attribute"
|
||||||
|
"go.opentelemetry.io/otel/exporters/otlp/otlptrace"
|
||||||
|
"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc"
|
||||||
|
|
||||||
|
"go.opentelemetry.io/otel/sdk/resource"
|
||||||
|
sdktrace "go.opentelemetry.io/otel/sdk/trace"
|
||||||
|
)
|
||||||
|
|
||||||
|
func initTracer() func(context.Context) error {
|
||||||
|
|
||||||
|
var secureOption otlptracegrpc.Option
|
||||||
|
|
||||||
|
if strings.ToLower(insecure) == "false" || insecure == "0" || strings.ToLower(insecure) == "f" {
|
||||||
|
secureOption = otlptracegrpc.WithTLSCredentials(credentials.NewClientTLSFromCert(nil, ""))
|
||||||
|
} else {
|
||||||
|
secureOption = otlptracegrpc.WithInsecure()
|
||||||
|
}
|
||||||
|
|
||||||
|
exporter, err := otlptrace.New(
|
||||||
|
context.Background(),
|
||||||
|
otlptracegrpc.NewClient(
|
||||||
|
secureOption,
|
||||||
|
otlptracegrpc.WithEndpoint(collectorURL),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalf("Failed to create exporter: %v", err)
|
||||||
|
}
|
||||||
|
resources, err := resource.New(
|
||||||
|
context.Background(),
|
||||||
|
resource.WithAttributes(
|
||||||
|
attribute.String("service.name", serviceName),
|
||||||
|
attribute.String("library.language", "go"),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalf("Could not set resources: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
otel.SetTracerProvider(
|
||||||
|
sdktrace.NewTracerProvider(
|
||||||
|
sdktrace.WithSampler(sdktrace.AlwaysSample()),
|
||||||
|
sdktrace.WithBatcher(exporter),
|
||||||
|
sdktrace.WithResource(resources),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
return exporter.Shutdown
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Step 4: Initialise the tracer in `main.go`
|
||||||
|
Modify the main function to initialise the tracer in main.go. Initiate the tracer at the very beginning of our main function.
|
||||||
|
```bash
|
||||||
|
func main() {
|
||||||
|
cleanup := initTracer()
|
||||||
|
defer cleanup(context.Background())
|
||||||
|
|
||||||
|
......
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Step 5: Add the OpenTelemetry Gin middleware
|
||||||
|
Configure Gin to use the middleware by adding the following lines in `main.go`
|
||||||
|
```bash
|
||||||
|
import (
|
||||||
|
....
|
||||||
|
"go.opentelemetry.io/contrib/instrumentation/github.com/gin-gonic/gin/otelgin"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
......
|
||||||
|
r := gin.Default()
|
||||||
|
r.Use(otelgin.Middleware(serviceName))
|
||||||
|
......
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
@ -0,0 +1,5 @@
|
|||||||
|
To run your Go Gin application, use the below command :
|
||||||
|
|
||||||
|
```bash
|
||||||
|
SERVICE_NAME={{MYAPP}} INSECURE_MODE=false OTEL_EXPORTER_OTLP_HEADERS=signoz-access-token={{SIGNOZ_INGESTION_KEY}} OTEL_EXPORTER_OTLP_ENDPOINT=ingest.{{REGION}}.signoz.cloud:443 go run main.go
|
||||||
|
```
|
@ -0,0 +1,93 @@
|
|||||||
|
### Setup OpenTelemetry Binary as an agent
|
||||||
|
|
||||||
|
### Step 1: Download otel-collector tar.gz
|
||||||
|
```bash
|
||||||
|
wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_darwin_amd64.tar.gz
|
||||||
|
```
|
||||||
|
|
||||||
|
### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder
|
||||||
|
```bash
|
||||||
|
mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_darwin_amd64.tar.gz -C otelcol-contrib
|
||||||
|
```
|
||||||
|
|
||||||
|
### Step 3: Create config.yaml in folder otelcol-contrib with the below content in it
|
||||||
|
```bash
|
||||||
|
receivers:
|
||||||
|
otlp:
|
||||||
|
protocols:
|
||||||
|
grpc:
|
||||||
|
endpoint: 0.0.0.0:4317
|
||||||
|
http:
|
||||||
|
endpoint: 0.0.0.0:4318
|
||||||
|
hostmetrics:
|
||||||
|
collection_interval: 60s
|
||||||
|
scrapers:
|
||||||
|
cpu: {}
|
||||||
|
disk: {}
|
||||||
|
load: {}
|
||||||
|
filesystem: {}
|
||||||
|
memory: {}
|
||||||
|
network: {}
|
||||||
|
paging: {}
|
||||||
|
process:
|
||||||
|
mute_process_name_error: true
|
||||||
|
mute_process_exe_error: true
|
||||||
|
mute_process_io_error: true
|
||||||
|
processes: {}
|
||||||
|
prometheus:
|
||||||
|
config:
|
||||||
|
global:
|
||||||
|
scrape_interval: 60s
|
||||||
|
scrape_configs:
|
||||||
|
- job_name: otel-collector-binary
|
||||||
|
static_configs:
|
||||||
|
- targets:
|
||||||
|
# - localhost:8888
|
||||||
|
processors:
|
||||||
|
batch:
|
||||||
|
send_batch_size: 1000
|
||||||
|
timeout: 10s
|
||||||
|
# Ref: https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/processor/resourcedetectionprocessor/README.md
|
||||||
|
resourcedetection:
|
||||||
|
detectors: [env, system] # Before system detector, include ec2 for AWS, gcp for GCP and azure for Azure.
|
||||||
|
# Using OTEL_RESOURCE_ATTRIBUTES envvar, env detector adds custom labels.
|
||||||
|
timeout: 2s
|
||||||
|
system:
|
||||||
|
hostname_sources: [os] # alternatively, use [dns,os] for setting FQDN as host.name and os as fallback
|
||||||
|
extensions:
|
||||||
|
health_check: {}
|
||||||
|
zpages: {}
|
||||||
|
exporters:
|
||||||
|
otlp:
|
||||||
|
endpoint: "ingest.{{REGION}}.signoz.cloud:443"
|
||||||
|
tls:
|
||||||
|
insecure: false
|
||||||
|
headers:
|
||||||
|
"signoz-access-token": "{{SIGNOZ_INGESTION_KEY}}"
|
||||||
|
logging:
|
||||||
|
verbosity: normal
|
||||||
|
service:
|
||||||
|
telemetry:
|
||||||
|
metrics:
|
||||||
|
address: 0.0.0.0:8888
|
||||||
|
extensions: [health_check, zpages]
|
||||||
|
pipelines:
|
||||||
|
metrics:
|
||||||
|
receivers: [otlp]
|
||||||
|
processors: [batch]
|
||||||
|
exporters: [otlp]
|
||||||
|
metrics/internal:
|
||||||
|
receivers: [prometheus, hostmetrics]
|
||||||
|
processors: [resourcedetection, batch]
|
||||||
|
exporters: [otlp]
|
||||||
|
traces:
|
||||||
|
receivers: [otlp]
|
||||||
|
processors: [batch]
|
||||||
|
exporters: [otlp]
|
||||||
|
logs:
|
||||||
|
receivers: [otlp]
|
||||||
|
processors: [batch]
|
||||||
|
exporters: [otlp]
|
||||||
|
```
|
||||||
|
|
||||||
|
|
@ -0,0 +1,116 @@
|
|||||||
|
After setting up the Otel collector agent, follow the steps below to instrumnet your Go Application
|
||||||
|
|
||||||
|
### Step 1: Install OpenTelemetry Dependencies
|
||||||
|
Dependencies related to OpenTelemetry exporter and SDK have to be installed first
|
||||||
|
|
||||||
|
Run the below commands after navigating to the application source folder:
|
||||||
|
```bash
|
||||||
|
go get go.opentelemetry.io/otel \
|
||||||
|
go.opentelemetry.io/otel/trace \
|
||||||
|
go.opentelemetry.io/otel/sdk \
|
||||||
|
go.opentelemetry.io/contrib/instrumentation/github.com/gin-gonic/gin/otelgin \
|
||||||
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace \
|
||||||
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc
|
||||||
|
```
|
||||||
|
|
||||||
|
**Note:** Note that we are assuming you are using gin request router. If you are using other request routers, check out the [corresponding package](https://signoz.io/docs/instrumentation/golang/#request-routers).
|
||||||
|
|
||||||
|
### Step 2: Declare environment variables for configuring OpenTelemetry
|
||||||
|
Declare the following global variables in **`main.go`** which we will use to configure OpenTelemetry:
|
||||||
|
```bash
|
||||||
|
var (
|
||||||
|
serviceName = os.Getenv("SERVICE_NAME")
|
||||||
|
collectorURL = os.Getenv("OTEL_EXPORTER_OTLP_ENDPOINT")
|
||||||
|
insecure = os.Getenv("INSECURE_MODE")
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
### Step 3: Instrument your Go application
|
||||||
|
To configure your application to send data we will need a function to initialize OpenTelemetry. Add the following snippet of code in your `main.go` file.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
|
||||||
|
import (
|
||||||
|
.....
|
||||||
|
|
||||||
|
"github.com/gin-gonic/gin"
|
||||||
|
"go.opentelemetry.io/otel"
|
||||||
|
"go.opentelemetry.io/otel/attribute"
|
||||||
|
"go.opentelemetry.io/otel/exporters/otlp/otlptrace"
|
||||||
|
"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc"
|
||||||
|
|
||||||
|
"go.opentelemetry.io/otel/sdk/resource"
|
||||||
|
sdktrace "go.opentelemetry.io/otel/sdk/trace"
|
||||||
|
)
|
||||||
|
|
||||||
|
func initTracer() func(context.Context) error {
|
||||||
|
|
||||||
|
var secureOption otlptracegrpc.Option
|
||||||
|
|
||||||
|
if strings.ToLower(insecure) == "false" || insecure == "0" || strings.ToLower(insecure) == "f" {
|
||||||
|
secureOption = otlptracegrpc.WithTLSCredentials(credentials.NewClientTLSFromCert(nil, ""))
|
||||||
|
} else {
|
||||||
|
secureOption = otlptracegrpc.WithInsecure()
|
||||||
|
}
|
||||||
|
|
||||||
|
exporter, err := otlptrace.New(
|
||||||
|
context.Background(),
|
||||||
|
otlptracegrpc.NewClient(
|
||||||
|
secureOption,
|
||||||
|
otlptracegrpc.WithEndpoint(collectorURL),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalf("Failed to create exporter: %v", err)
|
||||||
|
}
|
||||||
|
resources, err := resource.New(
|
||||||
|
context.Background(),
|
||||||
|
resource.WithAttributes(
|
||||||
|
attribute.String("service.name", serviceName),
|
||||||
|
attribute.String("library.language", "go"),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalf("Could not set resources: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
otel.SetTracerProvider(
|
||||||
|
sdktrace.NewTracerProvider(
|
||||||
|
sdktrace.WithSampler(sdktrace.AlwaysSample()),
|
||||||
|
sdktrace.WithBatcher(exporter),
|
||||||
|
sdktrace.WithResource(resources),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
return exporter.Shutdown
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Step 4: Initialise the tracer in `main.go`
|
||||||
|
Modify the main function to initialise the tracer in main.go. Initiate the tracer at the very beginning of our main function.
|
||||||
|
```bash
|
||||||
|
func main() {
|
||||||
|
cleanup := initTracer()
|
||||||
|
defer cleanup(context.Background())
|
||||||
|
|
||||||
|
......
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Step 5: Add the OpenTelemetry Gin middleware
|
||||||
|
Configure Gin to use the middleware by adding the following lines in `main.go`
|
||||||
|
```bash
|
||||||
|
import (
|
||||||
|
....
|
||||||
|
"go.opentelemetry.io/contrib/instrumentation/github.com/gin-gonic/gin/otelgin"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
......
|
||||||
|
r := gin.Default()
|
||||||
|
r.Use(otelgin.Middleware(serviceName))
|
||||||
|
......
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
@ -0,0 +1,21 @@
|
|||||||
|
Once you are done intrumenting your Go Gin application, you can run it using the below commands
|
||||||
|
|
||||||
|
### Step 1: Run OTel Collector
|
||||||
|
Run this command inside the `otelcol-contrib` directory that you created in the install Otel Collector step
|
||||||
|
|
||||||
|
```bash
|
||||||
|
./otelcol-contrib --config ./config.yaml &> otelcol-output.log & echo "$!" > otel-pid
|
||||||
|
```
|
||||||
|
### (Optional Step): View last 50 lines of `otelcol` logs
|
||||||
|
```bash
|
||||||
|
tail -f -n 50 otelcol-output.log
|
||||||
|
```
|
||||||
|
|
||||||
|
### (Optional Step): Stop `otelcol`
|
||||||
|
```bash
|
||||||
|
kill "$(< otel-pid)"
|
||||||
|
```
|
||||||
|
### Step 2: Set environment variables and run your Go Gin application
|
||||||
|
```bash
|
||||||
|
SERVICE_NAME={{MYAPP}} INSECURE_MODE=true OTEL_EXPORTER_OTLP_ENDPOINT=localhost:4317 go run main.go
|
||||||
|
```
|
@ -0,0 +1,115 @@
|
|||||||
|
|
||||||
|
### Step 1: Install OpenTelemetry Dependencies
|
||||||
|
Dependencies related to OpenTelemetry exporter and SDK have to be installed first
|
||||||
|
|
||||||
|
Run the below commands after navigating to the application source folder:
|
||||||
|
```bash
|
||||||
|
go get go.opentelemetry.io/otel \
|
||||||
|
go.opentelemetry.io/otel/trace \
|
||||||
|
go.opentelemetry.io/otel/sdk \
|
||||||
|
go.opentelemetry.io/contrib/instrumentation/github.com/gin-gonic/gin/otelgin \
|
||||||
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace \
|
||||||
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc
|
||||||
|
```
|
||||||
|
|
||||||
|
**Note:** Note that we are assuming you are using gin request router. If you are using other request routers, check out the [corresponding package](https://signoz.io/docs/instrumentation/golang/#request-routers).
|
||||||
|
|
||||||
|
### Step 2: Declare environment variables for configuring OpenTelemetry
|
||||||
|
Declare the following global variables in **`main.go`** which we will use to configure OpenTelemetry:
|
||||||
|
```bash
|
||||||
|
var (
|
||||||
|
serviceName = os.Getenv("SERVICE_NAME")
|
||||||
|
collectorURL = os.Getenv("OTEL_EXPORTER_OTLP_ENDPOINT")
|
||||||
|
insecure = os.Getenv("INSECURE_MODE")
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
### Step 3: Instrument your Go application
|
||||||
|
To configure your application to send data we will need a function to initialize OpenTelemetry. Add the following snippet of code in your `main.go` file.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
|
||||||
|
import (
|
||||||
|
.....
|
||||||
|
|
||||||
|
"github.com/gin-gonic/gin"
|
||||||
|
"go.opentelemetry.io/otel"
|
||||||
|
"go.opentelemetry.io/otel/attribute"
|
||||||
|
"go.opentelemetry.io/otel/exporters/otlp/otlptrace"
|
||||||
|
"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc"
|
||||||
|
|
||||||
|
"go.opentelemetry.io/otel/sdk/resource"
|
||||||
|
sdktrace "go.opentelemetry.io/otel/sdk/trace"
|
||||||
|
)
|
||||||
|
|
||||||
|
func initTracer() func(context.Context) error {
|
||||||
|
|
||||||
|
var secureOption otlptracegrpc.Option
|
||||||
|
|
||||||
|
if strings.ToLower(insecure) == "false" || insecure == "0" || strings.ToLower(insecure) == "f" {
|
||||||
|
secureOption = otlptracegrpc.WithTLSCredentials(credentials.NewClientTLSFromCert(nil, ""))
|
||||||
|
} else {
|
||||||
|
secureOption = otlptracegrpc.WithInsecure()
|
||||||
|
}
|
||||||
|
|
||||||
|
exporter, err := otlptrace.New(
|
||||||
|
context.Background(),
|
||||||
|
otlptracegrpc.NewClient(
|
||||||
|
secureOption,
|
||||||
|
otlptracegrpc.WithEndpoint(collectorURL),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalf("Failed to create exporter: %v", err)
|
||||||
|
}
|
||||||
|
resources, err := resource.New(
|
||||||
|
context.Background(),
|
||||||
|
resource.WithAttributes(
|
||||||
|
attribute.String("service.name", serviceName),
|
||||||
|
attribute.String("library.language", "go"),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalf("Could not set resources: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
otel.SetTracerProvider(
|
||||||
|
sdktrace.NewTracerProvider(
|
||||||
|
sdktrace.WithSampler(sdktrace.AlwaysSample()),
|
||||||
|
sdktrace.WithBatcher(exporter),
|
||||||
|
sdktrace.WithResource(resources),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
return exporter.Shutdown
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Step 4: Initialise the tracer in `main.go`
|
||||||
|
Modify the main function to initialise the tracer in main.go. Initiate the tracer at the very beginning of our main function.
|
||||||
|
```bash
|
||||||
|
func main() {
|
||||||
|
cleanup := initTracer()
|
||||||
|
defer cleanup(context.Background())
|
||||||
|
|
||||||
|
......
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Step 5: Add the OpenTelemetry Gin middleware
|
||||||
|
Configure Gin to use the middleware by adding the following lines in `main.go`
|
||||||
|
```bash
|
||||||
|
import (
|
||||||
|
....
|
||||||
|
"go.opentelemetry.io/contrib/instrumentation/github.com/gin-gonic/gin/otelgin"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
......
|
||||||
|
r := gin.Default()
|
||||||
|
r.Use(otelgin.Middleware(serviceName))
|
||||||
|
......
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
@ -0,0 +1,5 @@
|
|||||||
|
To run your Go Gin application, use the below command :
|
||||||
|
|
||||||
|
```bash
|
||||||
|
SERVICE_NAME={{MYAPP}} INSECURE_MODE=false OTEL_EXPORTER_OTLP_HEADERS=signoz-access-token={{SIGNOZ_INGESTION_KEY}} OTEL_EXPORTER_OTLP_ENDPOINT=ingest.{{REGION}}.signoz.cloud:443 go run main.go
|
||||||
|
```
|
@ -0,0 +1,92 @@
|
|||||||
|
### Setup OpenTelemetry Binary as an agent
|
||||||
|
|
||||||
|
### Step 1: Download otel-collector tar.gz
|
||||||
|
```bash
|
||||||
|
wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_darwin_arm64.tar.gz
|
||||||
|
|
||||||
|
### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder
|
||||||
|
```bash
|
||||||
|
mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_darwin_arm64.tar.gz -C otelcol-contrib
|
||||||
|
```
|
||||||
|
|
||||||
|
### Step 3: Create config.yaml in folder otelcol-contrib with the below content in it
|
||||||
|
```bash
|
||||||
|
receivers:
|
||||||
|
otlp:
|
||||||
|
protocols:
|
||||||
|
grpc:
|
||||||
|
endpoint: 0.0.0.0:4317
|
||||||
|
http:
|
||||||
|
endpoint: 0.0.0.0:4318
|
||||||
|
hostmetrics:
|
||||||
|
collection_interval: 60s
|
||||||
|
scrapers:
|
||||||
|
cpu: {}
|
||||||
|
disk: {}
|
||||||
|
load: {}
|
||||||
|
filesystem: {}
|
||||||
|
memory: {}
|
||||||
|
network: {}
|
||||||
|
paging: {}
|
||||||
|
process:
|
||||||
|
mute_process_name_error: true
|
||||||
|
mute_process_exe_error: true
|
||||||
|
mute_process_io_error: true
|
||||||
|
processes: {}
|
||||||
|
prometheus:
|
||||||
|
config:
|
||||||
|
global:
|
||||||
|
scrape_interval: 60s
|
||||||
|
scrape_configs:
|
||||||
|
- job_name: otel-collector-binary
|
||||||
|
static_configs:
|
||||||
|
- targets:
|
||||||
|
# - localhost:8888
|
||||||
|
processors:
|
||||||
|
batch:
|
||||||
|
send_batch_size: 1000
|
||||||
|
timeout: 10s
|
||||||
|
# Ref: https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/processor/resourcedetectionprocessor/README.md
|
||||||
|
resourcedetection:
|
||||||
|
detectors: [env, system] # Before system detector, include ec2 for AWS, gcp for GCP and azure for Azure.
|
||||||
|
# Using OTEL_RESOURCE_ATTRIBUTES envvar, env detector adds custom labels.
|
||||||
|
timeout: 2s
|
||||||
|
system:
|
||||||
|
hostname_sources: [os] # alternatively, use [dns,os] for setting FQDN as host.name and os as fallback
|
||||||
|
extensions:
|
||||||
|
health_check: {}
|
||||||
|
zpages: {}
|
||||||
|
exporters:
|
||||||
|
otlp:
|
||||||
|
endpoint: "ingest.{{REGION}}.signoz.cloud:443"
|
||||||
|
tls:
|
||||||
|
insecure: false
|
||||||
|
headers:
|
||||||
|
"signoz-access-token": "{{SIGNOZ_INGESTION_KEY}}"
|
||||||
|
logging:
|
||||||
|
verbosity: normal
|
||||||
|
service:
|
||||||
|
telemetry:
|
||||||
|
metrics:
|
||||||
|
address: 0.0.0.0:8888
|
||||||
|
extensions: [health_check, zpages]
|
||||||
|
pipelines:
|
||||||
|
metrics:
|
||||||
|
receivers: [otlp]
|
||||||
|
processors: [batch]
|
||||||
|
exporters: [otlp]
|
||||||
|
metrics/internal:
|
||||||
|
receivers: [prometheus, hostmetrics]
|
||||||
|
processors: [resourcedetection, batch]
|
||||||
|
exporters: [otlp]
|
||||||
|
traces:
|
||||||
|
receivers: [otlp]
|
||||||
|
processors: [batch]
|
||||||
|
exporters: [otlp]
|
||||||
|
logs:
|
||||||
|
receivers: [otlp]
|
||||||
|
processors: [batch]
|
||||||
|
exporters: [otlp]
|
||||||
|
```
|
||||||
|
|
||||||
|
|
@ -0,0 +1,116 @@
|
|||||||
|
After setting up the Otel collector agent, follow the steps below to instrumnet your Go Application
|
||||||
|
|
||||||
|
### Step 1: Install OpenTelemetry Dependencies
|
||||||
|
Dependencies related to OpenTelemetry exporter and SDK have to be installed first
|
||||||
|
|
||||||
|
Run the below commands after navigating to the application source folder:
|
||||||
|
```bash
|
||||||
|
go get go.opentelemetry.io/otel \
|
||||||
|
go.opentelemetry.io/otel/trace \
|
||||||
|
go.opentelemetry.io/otel/sdk \
|
||||||
|
go.opentelemetry.io/contrib/instrumentation/github.com/gin-gonic/gin/otelgin \
|
||||||
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace \
|
||||||
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc
|
||||||
|
```
|
||||||
|
|
||||||
|
**Note:** Note that we are assuming you are using gin request router. If you are using other request routers, check out the [corresponding package](https://signoz.io/docs/instrumentation/golang/#request-routers).
|
||||||
|
|
||||||
|
### Step 2: Declare environment variables for configuring OpenTelemetry
|
||||||
|
Declare the following global variables in **`main.go`** which we will use to configure OpenTelemetry:
|
||||||
|
```bash
|
||||||
|
var (
|
||||||
|
serviceName = os.Getenv("SERVICE_NAME")
|
||||||
|
collectorURL = os.Getenv("OTEL_EXPORTER_OTLP_ENDPOINT")
|
||||||
|
insecure = os.Getenv("INSECURE_MODE")
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
### Step 3: Instrument your Go application
|
||||||
|
To configure your application to send data we will need a function to initialize OpenTelemetry. Add the following snippet of code in your `main.go` file.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
|
||||||
|
import (
|
||||||
|
.....
|
||||||
|
|
||||||
|
"github.com/gin-gonic/gin"
|
||||||
|
"go.opentelemetry.io/otel"
|
||||||
|
"go.opentelemetry.io/otel/attribute"
|
||||||
|
"go.opentelemetry.io/otel/exporters/otlp/otlptrace"
|
||||||
|
"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc"
|
||||||
|
|
||||||
|
"go.opentelemetry.io/otel/sdk/resource"
|
||||||
|
sdktrace "go.opentelemetry.io/otel/sdk/trace"
|
||||||
|
)
|
||||||
|
|
||||||
|
func initTracer() func(context.Context) error {
|
||||||
|
|
||||||
|
var secureOption otlptracegrpc.Option
|
||||||
|
|
||||||
|
if strings.ToLower(insecure) == "false" || insecure == "0" || strings.ToLower(insecure) == "f" {
|
||||||
|
secureOption = otlptracegrpc.WithTLSCredentials(credentials.NewClientTLSFromCert(nil, ""))
|
||||||
|
} else {
|
||||||
|
secureOption = otlptracegrpc.WithInsecure()
|
||||||
|
}
|
||||||
|
|
||||||
|
exporter, err := otlptrace.New(
|
||||||
|
context.Background(),
|
||||||
|
otlptracegrpc.NewClient(
|
||||||
|
secureOption,
|
||||||
|
otlptracegrpc.WithEndpoint(collectorURL),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalf("Failed to create exporter: %v", err)
|
||||||
|
}
|
||||||
|
resources, err := resource.New(
|
||||||
|
context.Background(),
|
||||||
|
resource.WithAttributes(
|
||||||
|
attribute.String("service.name", serviceName),
|
||||||
|
attribute.String("library.language", "go"),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalf("Could not set resources: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
otel.SetTracerProvider(
|
||||||
|
sdktrace.NewTracerProvider(
|
||||||
|
sdktrace.WithSampler(sdktrace.AlwaysSample()),
|
||||||
|
sdktrace.WithBatcher(exporter),
|
||||||
|
sdktrace.WithResource(resources),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
return exporter.Shutdown
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Step 4: Initialise the tracer in `main.go`
|
||||||
|
Modify the main function to initialise the tracer in main.go. Initiate the tracer at the very beginning of our main function.
|
||||||
|
```bash
|
||||||
|
func main() {
|
||||||
|
cleanup := initTracer()
|
||||||
|
defer cleanup(context.Background())
|
||||||
|
|
||||||
|
......
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Step 5: Add the OpenTelemetry Gin middleware
|
||||||
|
Configure Gin to use the middleware by adding the following lines in `main.go`
|
||||||
|
```bash
|
||||||
|
import (
|
||||||
|
....
|
||||||
|
"go.opentelemetry.io/contrib/instrumentation/github.com/gin-gonic/gin/otelgin"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
......
|
||||||
|
r := gin.Default()
|
||||||
|
r.Use(otelgin.Middleware(serviceName))
|
||||||
|
......
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
@ -0,0 +1,21 @@
|
|||||||
|
Once you are done intrumenting your Go Gin application, you can run it using the below commands
|
||||||
|
|
||||||
|
### Step 1: Run OTel Collector
|
||||||
|
Run this command inside the `otelcol-contrib` directory that you created in the install Otel Collector step
|
||||||
|
|
||||||
|
```bash
|
||||||
|
./otelcol-contrib --config ./config.yaml &> otelcol-output.log & echo "$!" > otel-pid
|
||||||
|
```
|
||||||
|
### (Optional Step): View last 50 lines of `otelcol` logs
|
||||||
|
```bash
|
||||||
|
tail -f -n 50 otelcol-output.log
|
||||||
|
```
|
||||||
|
|
||||||
|
### (Optional Step): Stop `otelcol`
|
||||||
|
```bash
|
||||||
|
kill "$(< otel-pid)"
|
||||||
|
```
|
||||||
|
### Step 2: Set environment variables and run your Go Gin application
|
||||||
|
```bash
|
||||||
|
SERVICE_NAME={{MYAPP}} INSECURE_MODE=true OTEL_EXPORTER_OTLP_ENDPOINT=localhost:4317 go run main.go
|
||||||
|
```
|
@ -0,0 +1,21 @@
|
|||||||
|
### Install otel-collector in your Kubernetes infra
|
||||||
|
|
||||||
|
Add the SigNoz Helm Chart repository
|
||||||
|
```bash
|
||||||
|
helm repo add signoz https://charts.signoz.io
|
||||||
|
```
|
||||||
|
|
||||||
|
If the chart is already present, update the chart to the latest using:
|
||||||
|
```bash
|
||||||
|
helm repo update
|
||||||
|
```
|
||||||
|
|
||||||
|
Install the Kubernetes Infrastructure chart provided by SigNoz
|
||||||
|
```bash
|
||||||
|
helm install my-release signoz/k8s-infra \
|
||||||
|
--set otelCollectorEndpoint=ingest.{{REGION}}.signoz.cloud:443 \
|
||||||
|
--set otelInsecure=false \
|
||||||
|
--set signozApiKey={{SIGNOZ_INGESTION_KEY}} \
|
||||||
|
--set global.clusterName=<CLUSTER_NAME>
|
||||||
|
```
|
||||||
|
- Replace `<CLUSTER_NAME>` with the name of the Kubernetes cluster or a unique identifier of the cluster.
|
@ -0,0 +1,10 @@
|
|||||||
|
After setting up the Otel collector agent, follow the steps below to instrumnet your JavaScript Application
|
||||||
|
|
||||||
|
#### Requirements
|
||||||
|
- Java 8 or higher
|
||||||
|
|
||||||
|
### Download otel java binary
|
||||||
|
|
||||||
|
```bash
|
||||||
|
wget https://github.com/open-telemetry/opentelemetry-java-instrumentation/releases/latest/download/opentelemetry-javaagent.jar
|
||||||
|
```
|
@ -0,0 +1,14 @@
|
|||||||
|
### Open `standalone.conf` Configuration File
|
||||||
|
```bash
|
||||||
|
vim /opt/jboss-eap-7.1/bin/standalone.conf
|
||||||
|
```
|
||||||
|
|
||||||
|
### Update `JAVA_OPTS` environment variable
|
||||||
|
```bash
|
||||||
|
JAVA_OPTS="-javaagent:/<path>/opentelemetry-javaagent.jar"
|
||||||
|
```
|
||||||
|
|
||||||
|
<path> - update it to the path where you downloaded the Java JAR agent in previous step
|
||||||
|
|
||||||
|
**Note:**
|
||||||
|
- In case you're dockerising your application, make sure to dockerise it along with OpenTelemetry instrumentation done in previous step.
|
@ -0,0 +1,8 @@
|
|||||||
|
#### Requirements
|
||||||
|
- Java 8 or higher
|
||||||
|
|
||||||
|
### Download otel java binary
|
||||||
|
|
||||||
|
```bash
|
||||||
|
wget https://github.com/open-telemetry/opentelemetry-java-instrumentation/releases/latest/download/opentelemetry-javaagent.jar
|
||||||
|
```
|
@ -0,0 +1,23 @@
|
|||||||
|
### Open `standalone.conf` Configuration File
|
||||||
|
```bash
|
||||||
|
vim /opt/jboss-eap-7.1/bin/standalone.conf
|
||||||
|
```
|
||||||
|
|
||||||
|
### Update `JAVA_OPTS` environment variable
|
||||||
|
Update `JAVA_OPTS` environment variable with configurations required to send data to SigNoz cloud in your configuration file.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
JAVA_OPTS="-javaagent:/<path>/opentelemetry-javaagent.jar
|
||||||
|
-Dotel.exporter.otlp.endpoint=https://ingest.{{REGION}}.signoz.cloud:443
|
||||||
|
-Dotel.exporter.otlp.headers="signoz-access-token={{SIGNOZ_INGESTION_KEY}}"
|
||||||
|
-Dotel.resource.attributes="service.name={{MYAPP}}""
|
||||||
|
```
|
||||||
|
|
||||||
|
<path> - update it to the path where you downloaded the Java JAR agent in previous step
|
||||||
|
|
||||||
|
|
||||||
|
### (Optional step) Write the output/logs of standalone.sh script to a file nohup.out as a background thread
|
||||||
|
```bash
|
||||||
|
/opt/jboss-eap-7.1/bin/standalone.sh > /opt/jboss-eap-7.1/bin/nohup.out &
|
||||||
|
|
||||||
|
```
|
@ -0,0 +1,93 @@
|
|||||||
|
### Setup OpenTelemetry Binary as an agent
|
||||||
|
|
||||||
|
### Step 1: Download otel-collector tar.gz
|
||||||
|
```bash
|
||||||
|
wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_linux_amd64.tar.gz
|
||||||
|
```
|
||||||
|
|
||||||
|
### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder
|
||||||
|
```bash
|
||||||
|
mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_linux_amd64.tar.gz -C otelcol-contrib
|
||||||
|
```
|
||||||
|
|
||||||
|
### Step 3: Create config.yaml in folder otelcol-contrib with the below content in it
|
||||||
|
```bash
|
||||||
|
receivers:
|
||||||
|
otlp:
|
||||||
|
protocols:
|
||||||
|
grpc:
|
||||||
|
endpoint: 0.0.0.0:4317
|
||||||
|
http:
|
||||||
|
endpoint: 0.0.0.0:4318
|
||||||
|
hostmetrics:
|
||||||
|
collection_interval: 60s
|
||||||
|
scrapers:
|
||||||
|
cpu: {}
|
||||||
|
disk: {}
|
||||||
|
load: {}
|
||||||
|
filesystem: {}
|
||||||
|
memory: {}
|
||||||
|
network: {}
|
||||||
|
paging: {}
|
||||||
|
process:
|
||||||
|
mute_process_name_error: true
|
||||||
|
mute_process_exe_error: true
|
||||||
|
mute_process_io_error: true
|
||||||
|
processes: {}
|
||||||
|
prometheus:
|
||||||
|
config:
|
||||||
|
global:
|
||||||
|
scrape_interval: 60s
|
||||||
|
scrape_configs:
|
||||||
|
- job_name: otel-collector-binary
|
||||||
|
static_configs:
|
||||||
|
- targets:
|
||||||
|
# - localhost:8888
|
||||||
|
processors:
|
||||||
|
batch:
|
||||||
|
send_batch_size: 1000
|
||||||
|
timeout: 10s
|
||||||
|
# Ref: https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/processor/resourcedetectionprocessor/README.md
|
||||||
|
resourcedetection:
|
||||||
|
detectors: [env, system] # Before system detector, include ec2 for AWS, gcp for GCP and azure for Azure.
|
||||||
|
# Using OTEL_RESOURCE_ATTRIBUTES envvar, env detector adds custom labels.
|
||||||
|
timeout: 2s
|
||||||
|
system:
|
||||||
|
hostname_sources: [os] # alternatively, use [dns,os] for setting FQDN as host.name and os as fallback
|
||||||
|
extensions:
|
||||||
|
health_check: {}
|
||||||
|
zpages: {}
|
||||||
|
exporters:
|
||||||
|
otlp:
|
||||||
|
endpoint: "ingest.{{REGION}}.signoz.cloud:443"
|
||||||
|
tls:
|
||||||
|
insecure: false
|
||||||
|
headers:
|
||||||
|
"signoz-access-token": "{{SIGNOZ_INGESTION_KEY}}"
|
||||||
|
logging:
|
||||||
|
verbosity: normal
|
||||||
|
service:
|
||||||
|
telemetry:
|
||||||
|
metrics:
|
||||||
|
address: 0.0.0.0:8888
|
||||||
|
extensions: [health_check, zpages]
|
||||||
|
pipelines:
|
||||||
|
metrics:
|
||||||
|
receivers: [otlp]
|
||||||
|
processors: [batch]
|
||||||
|
exporters: [otlp]
|
||||||
|
metrics/internal:
|
||||||
|
receivers: [prometheus, hostmetrics]
|
||||||
|
processors: [resourcedetection, batch]
|
||||||
|
exporters: [otlp]
|
||||||
|
traces:
|
||||||
|
receivers: [otlp]
|
||||||
|
processors: [batch]
|
||||||
|
exporters: [otlp]
|
||||||
|
logs:
|
||||||
|
receivers: [otlp]
|
||||||
|
processors: [batch]
|
||||||
|
exporters: [otlp]
|
||||||
|
```
|
||||||
|
|
||||||
|
|
@ -0,0 +1,10 @@
|
|||||||
|
After setting up the Otel collector agent, follow the steps below to instrumnet your JavaScript Application
|
||||||
|
|
||||||
|
#### Requirements
|
||||||
|
- Java 8 or higher
|
||||||
|
|
||||||
|
### Download otel java binary
|
||||||
|
|
||||||
|
```bash
|
||||||
|
wget https://github.com/open-telemetry/opentelemetry-java-instrumentation/releases/latest/download/opentelemetry-javaagent.jar
|
||||||
|
```
|
@ -0,0 +1,30 @@
|
|||||||
|
Once you are done intrumenting your Java application, you can run it using the below commands
|
||||||
|
|
||||||
|
### Step 1: Run OTel Collector
|
||||||
|
Run this command inside the `otelcol-contrib` directory that you created in the install Otel Collector step
|
||||||
|
|
||||||
|
```bash
|
||||||
|
./otelcol-contrib --config ./config.yaml &> otelcol-output.log & echo "$!" > otel-pid
|
||||||
|
```
|
||||||
|
### (Optional Step): View last 50 lines of `otelcol` logs
|
||||||
|
```bash
|
||||||
|
tail -f -n 50 otelcol-output.log
|
||||||
|
```
|
||||||
|
|
||||||
|
### (Optional Step): Stop `otelcol`
|
||||||
|
```bash
|
||||||
|
kill "$(< otel-pid)"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Step 2: Open `standalone.conf` Configuration File
|
||||||
|
```bash
|
||||||
|
vim /opt/jboss-eap-7.1/bin/standalone.conf
|
||||||
|
```
|
||||||
|
|
||||||
|
### Step 3: Update `JAVA_OPTS` environment variable
|
||||||
|
```bash
|
||||||
|
JAVA_OPTS="-javaagent:/<path>/opentelemetry-javaagent.jar"
|
||||||
|
```
|
||||||
|
|
||||||
|
<path> - update it to the path where you downloaded the Java JAR agent in previous step
|
||||||
|
|
@ -0,0 +1,8 @@
|
|||||||
|
#### Requirements
|
||||||
|
- Java 8 or higher
|
||||||
|
|
||||||
|
### Download otel java binary
|
||||||
|
|
||||||
|
```bash
|
||||||
|
wget https://github.com/open-telemetry/opentelemetry-java-instrumentation/releases/latest/download/opentelemetry-javaagent.jar
|
||||||
|
```
|
@ -0,0 +1,23 @@
|
|||||||
|
### Open `standalone.conf` Configuration File
|
||||||
|
```bash
|
||||||
|
vim /opt/jboss-eap-7.1/bin/standalone.conf
|
||||||
|
```
|
||||||
|
|
||||||
|
### Update `JAVA_OPTS` environment variable
|
||||||
|
Update `JAVA_OPTS` environment variable with configurations required to send data to SigNoz cloud in your configuration file.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
JAVA_OPTS="-javaagent:/<path>/opentelemetry-javaagent.jar
|
||||||
|
-Dotel.exporter.otlp.endpoint=https://ingest.{{REGION}}.signoz.cloud:443
|
||||||
|
-Dotel.exporter.otlp.headers="signoz-access-token={{SIGNOZ_INGESTION_KEY}}"
|
||||||
|
-Dotel.resource.attributes="service.name={{MYAPP}}""
|
||||||
|
```
|
||||||
|
|
||||||
|
<path> - update it to the path where you downloaded the Java JAR agent in previous step
|
||||||
|
|
||||||
|
|
||||||
|
### (Optional step) Write the output/logs of standalone.sh script to a file nohup.out as a background thread
|
||||||
|
```bash
|
||||||
|
/opt/jboss-eap-7.1/bin/standalone.sh > /opt/jboss-eap-7.1/bin/nohup.out &
|
||||||
|
|
||||||
|
```
|
@ -0,0 +1,93 @@
|
|||||||
|
### Setup OpenTelemetry Binary as an agent
|
||||||
|
|
||||||
|
### Step 1: Download otel-collector tar.gz
|
||||||
|
```bash
|
||||||
|
wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_linux_arm64.tar.gz
|
||||||
|
```
|
||||||
|
|
||||||
|
### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder
|
||||||
|
```bash
|
||||||
|
mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_linux_arm64.tar.gz -C otelcol-contrib
|
||||||
|
```
|
||||||
|
|
||||||
|
### Step 3: Create config.yaml in folder otelcol-contrib with the below content in it
|
||||||
|
```bash
|
||||||
|
receivers:
|
||||||
|
otlp:
|
||||||
|
protocols:
|
||||||
|
grpc:
|
||||||
|
endpoint: 0.0.0.0:4317
|
||||||
|
http:
|
||||||
|
endpoint: 0.0.0.0:4318
|
||||||
|
hostmetrics:
|
||||||
|
collection_interval: 60s
|
||||||
|
scrapers:
|
||||||
|
cpu: {}
|
||||||
|
disk: {}
|
||||||
|
load: {}
|
||||||
|
filesystem: {}
|
||||||
|
memory: {}
|
||||||
|
network: {}
|
||||||
|
paging: {}
|
||||||
|
process:
|
||||||
|
mute_process_name_error: true
|
||||||
|
mute_process_exe_error: true
|
||||||
|
mute_process_io_error: true
|
||||||
|
processes: {}
|
||||||
|
prometheus:
|
||||||
|
config:
|
||||||
|
global:
|
||||||
|
scrape_interval: 60s
|
||||||
|
scrape_configs:
|
||||||
|
- job_name: otel-collector-binary
|
||||||
|
static_configs:
|
||||||
|
- targets:
|
||||||
|
# - localhost:8888
|
||||||
|
processors:
|
||||||
|
batch:
|
||||||
|
send_batch_size: 1000
|
||||||
|
timeout: 10s
|
||||||
|
# Ref: https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/processor/resourcedetectionprocessor/README.md
|
||||||
|
resourcedetection:
|
||||||
|
detectors: [env, system] # Before system detector, include ec2 for AWS, gcp for GCP and azure for Azure.
|
||||||
|
# Using OTEL_RESOURCE_ATTRIBUTES envvar, env detector adds custom labels.
|
||||||
|
timeout: 2s
|
||||||
|
system:
|
||||||
|
hostname_sources: [os] # alternatively, use [dns,os] for setting FQDN as host.name and os as fallback
|
||||||
|
extensions:
|
||||||
|
health_check: {}
|
||||||
|
zpages: {}
|
||||||
|
exporters:
|
||||||
|
otlp:
|
||||||
|
endpoint: "ingest.{{REGION}}.signoz.cloud:443"
|
||||||
|
tls:
|
||||||
|
insecure: false
|
||||||
|
headers:
|
||||||
|
"signoz-access-token": "{{SIGNOZ_INGESTION_KEY}}"
|
||||||
|
logging:
|
||||||
|
verbosity: normal
|
||||||
|
service:
|
||||||
|
telemetry:
|
||||||
|
metrics:
|
||||||
|
address: 0.0.0.0:8888
|
||||||
|
extensions: [health_check, zpages]
|
||||||
|
pipelines:
|
||||||
|
metrics:
|
||||||
|
receivers: [otlp]
|
||||||
|
processors: [batch]
|
||||||
|
exporters: [otlp]
|
||||||
|
metrics/internal:
|
||||||
|
receivers: [prometheus, hostmetrics]
|
||||||
|
processors: [resourcedetection, batch]
|
||||||
|
exporters: [otlp]
|
||||||
|
traces:
|
||||||
|
receivers: [otlp]
|
||||||
|
processors: [batch]
|
||||||
|
exporters: [otlp]
|
||||||
|
logs:
|
||||||
|
receivers: [otlp]
|
||||||
|
processors: [batch]
|
||||||
|
exporters: [otlp]
|
||||||
|
```
|
||||||
|
|
||||||
|
|
@ -0,0 +1,10 @@
|
|||||||
|
After setting up the Otel collector agent, follow the steps below to instrumnet your JavaScript Application
|
||||||
|
|
||||||
|
#### Requirements
|
||||||
|
- Java 8 or higher
|
||||||
|
|
||||||
|
### Download otel java binary
|
||||||
|
|
||||||
|
```bash
|
||||||
|
wget https://github.com/open-telemetry/opentelemetry-java-instrumentation/releases/latest/download/opentelemetry-javaagent.jar
|
||||||
|
```
|
@ -0,0 +1,30 @@
|
|||||||
|
Once you are done intrumenting your Java application, you can run it using the below commands
|
||||||
|
|
||||||
|
### Step 1: Run OTel Collector
|
||||||
|
Run this command inside the `otelcol-contrib` directory that you created in the install Otel Collector step
|
||||||
|
|
||||||
|
```bash
|
||||||
|
./otelcol-contrib --config ./config.yaml &> otelcol-output.log & echo "$!" > otel-pid
|
||||||
|
```
|
||||||
|
### (Optional Step): View last 50 lines of `otelcol` logs
|
||||||
|
```bash
|
||||||
|
tail -f -n 50 otelcol-output.log
|
||||||
|
```
|
||||||
|
|
||||||
|
### (Optional Step): Stop `otelcol`
|
||||||
|
```bash
|
||||||
|
kill "$(< otel-pid)"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Step 2: Open `standalone.conf` Configuration File
|
||||||
|
```bash
|
||||||
|
vim /opt/jboss-eap-7.1/bin/standalone.conf
|
||||||
|
```
|
||||||
|
|
||||||
|
### Step 3: Update `JAVA_OPTS` environment variable
|
||||||
|
```bash
|
||||||
|
JAVA_OPTS="-javaagent:/<path>/opentelemetry-javaagent.jar"
|
||||||
|
```
|
||||||
|
|
||||||
|
<path> - update it to the path where you downloaded the Java JAR agent in previous step
|
||||||
|
|
@ -0,0 +1,8 @@
|
|||||||
|
#### Requirements
|
||||||
|
- Java 8 or higher
|
||||||
|
|
||||||
|
### Download otel java binary
|
||||||
|
|
||||||
|
```bash
|
||||||
|
wget https://github.com/open-telemetry/opentelemetry-java-instrumentation/releases/latest/download/opentelemetry-javaagent.jar
|
||||||
|
```
|
@ -0,0 +1,23 @@
|
|||||||
|
### Open `standalone.conf` Configuration File
|
||||||
|
```bash
|
||||||
|
vim /opt/jboss-eap-7.1/bin/standalone.conf
|
||||||
|
```
|
||||||
|
|
||||||
|
### Update `JAVA_OPTS` environment variable
|
||||||
|
Update `JAVA_OPTS` environment variable with configurations required to send data to SigNoz cloud in your configuration file.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
JAVA_OPTS="-javaagent:/<path>/opentelemetry-javaagent.jar
|
||||||
|
-Dotel.exporter.otlp.endpoint=https://ingest.{{REGION}}.signoz.cloud:443
|
||||||
|
-Dotel.exporter.otlp.headers="signoz-access-token={{SIGNOZ_INGESTION_KEY}}"
|
||||||
|
-Dotel.resource.attributes="service.name={{MYAPP}}""
|
||||||
|
```
|
||||||
|
|
||||||
|
<path> - update it to the path where you downloaded the Java JAR agent in previous step
|
||||||
|
|
||||||
|
|
||||||
|
### (Optional step) Write the output/logs of standalone.sh script to a file nohup.out as a background thread
|
||||||
|
```bash
|
||||||
|
/opt/jboss-eap-7.1/bin/standalone.sh > /opt/jboss-eap-7.1/bin/nohup.out &
|
||||||
|
|
||||||
|
```
|
@ -0,0 +1,93 @@
|
|||||||
|
### Setup OpenTelemetry Binary as an agent
|
||||||
|
|
||||||
|
### Step 1: Download otel-collector tar.gz
|
||||||
|
```bash
|
||||||
|
wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_darwin_amd64.tar.gz
|
||||||
|
```
|
||||||
|
|
||||||
|
### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder
|
||||||
|
```bash
|
||||||
|
mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_darwin_amd64.tar.gz -C otelcol-contrib
|
||||||
|
```
|
||||||
|
|
||||||
|
### Step 3: Create config.yaml in folder otelcol-contrib with the below content in it
|
||||||
|
```bash
|
||||||
|
receivers:
|
||||||
|
otlp:
|
||||||
|
protocols:
|
||||||
|
grpc:
|
||||||
|
endpoint: 0.0.0.0:4317
|
||||||
|
http:
|
||||||
|
endpoint: 0.0.0.0:4318
|
||||||
|
hostmetrics:
|
||||||
|
collection_interval: 60s
|
||||||
|
scrapers:
|
||||||
|
cpu: {}
|
||||||
|
disk: {}
|
||||||
|
load: {}
|
||||||
|
filesystem: {}
|
||||||
|
memory: {}
|
||||||
|
network: {}
|
||||||
|
paging: {}
|
||||||
|
process:
|
||||||
|
mute_process_name_error: true
|
||||||
|
mute_process_exe_error: true
|
||||||
|
mute_process_io_error: true
|
||||||
|
processes: {}
|
||||||
|
prometheus:
|
||||||
|
config:
|
||||||
|
global:
|
||||||
|
scrape_interval: 60s
|
||||||
|
scrape_configs:
|
||||||
|
- job_name: otel-collector-binary
|
||||||
|
static_configs:
|
||||||
|
- targets:
|
||||||
|
# - localhost:8888
|
||||||
|
processors:
|
||||||
|
batch:
|
||||||
|
send_batch_size: 1000
|
||||||
|
timeout: 10s
|
||||||
|
# Ref: https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/processor/resourcedetectionprocessor/README.md
|
||||||
|
resourcedetection:
|
||||||
|
detectors: [env, system] # Before system detector, include ec2 for AWS, gcp for GCP and azure for Azure.
|
||||||
|
# Using OTEL_RESOURCE_ATTRIBUTES envvar, env detector adds custom labels.
|
||||||
|
timeout: 2s
|
||||||
|
system:
|
||||||
|
hostname_sources: [os] # alternatively, use [dns,os] for setting FQDN as host.name and os as fallback
|
||||||
|
extensions:
|
||||||
|
health_check: {}
|
||||||
|
zpages: {}
|
||||||
|
exporters:
|
||||||
|
otlp:
|
||||||
|
endpoint: "ingest.{{REGION}}.signoz.cloud:443"
|
||||||
|
tls:
|
||||||
|
insecure: false
|
||||||
|
headers:
|
||||||
|
"signoz-access-token": "{{SIGNOZ_INGESTION_KEY}}"
|
||||||
|
logging:
|
||||||
|
verbosity: normal
|
||||||
|
service:
|
||||||
|
telemetry:
|
||||||
|
metrics:
|
||||||
|
address: 0.0.0.0:8888
|
||||||
|
extensions: [health_check, zpages]
|
||||||
|
pipelines:
|
||||||
|
metrics:
|
||||||
|
receivers: [otlp]
|
||||||
|
processors: [batch]
|
||||||
|
exporters: [otlp]
|
||||||
|
metrics/internal:
|
||||||
|
receivers: [prometheus, hostmetrics]
|
||||||
|
processors: [resourcedetection, batch]
|
||||||
|
exporters: [otlp]
|
||||||
|
traces:
|
||||||
|
receivers: [otlp]
|
||||||
|
processors: [batch]
|
||||||
|
exporters: [otlp]
|
||||||
|
logs:
|
||||||
|
receivers: [otlp]
|
||||||
|
processors: [batch]
|
||||||
|
exporters: [otlp]
|
||||||
|
```
|
||||||
|
|
||||||
|
|
@ -0,0 +1,10 @@
|
|||||||
|
After setting up the Otel collector agent, follow the steps below to instrumnet your JavaScript Application
|
||||||
|
|
||||||
|
#### Requirements
|
||||||
|
- Java 8 or higher
|
||||||
|
|
||||||
|
### Download otel java binary
|
||||||
|
|
||||||
|
```bash
|
||||||
|
wget https://github.com/open-telemetry/opentelemetry-java-instrumentation/releases/latest/download/opentelemetry-javaagent.jar
|
||||||
|
```
|
@ -0,0 +1,30 @@
|
|||||||
|
Once you are done intrumenting your Java application, you can run it using the below commands
|
||||||
|
|
||||||
|
### Step 1: Run OTel Collector
|
||||||
|
Run this command inside the `otelcol-contrib` directory that you created in the install Otel Collector step
|
||||||
|
|
||||||
|
```bash
|
||||||
|
./otelcol-contrib --config ./config.yaml &> otelcol-output.log & echo "$!" > otel-pid
|
||||||
|
```
|
||||||
|
### (Optional Step): View last 50 lines of `otelcol` logs
|
||||||
|
```bash
|
||||||
|
tail -f -n 50 otelcol-output.log
|
||||||
|
```
|
||||||
|
|
||||||
|
### (Optional Step): Stop `otelcol`
|
||||||
|
```bash
|
||||||
|
kill "$(< otel-pid)"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Step 2: Open `standalone.conf` Configuration File
|
||||||
|
```bash
|
||||||
|
vim /opt/jboss-eap-7.1/bin/standalone.conf
|
||||||
|
```
|
||||||
|
|
||||||
|
### Step 3: Update `JAVA_OPTS` environment variable
|
||||||
|
```bash
|
||||||
|
JAVA_OPTS="-javaagent:/<path>/opentelemetry-javaagent.jar"
|
||||||
|
```
|
||||||
|
|
||||||
|
<path> - update it to the path where you downloaded the Java JAR agent in previous step
|
||||||
|
|
@ -0,0 +1,8 @@
|
|||||||
|
#### Requirements
|
||||||
|
- Java 8 or higher
|
||||||
|
|
||||||
|
### Download otel java binary
|
||||||
|
|
||||||
|
```bash
|
||||||
|
wget https://github.com/open-telemetry/opentelemetry-java-instrumentation/releases/latest/download/opentelemetry-javaagent.jar
|
||||||
|
```
|
@ -0,0 +1,23 @@
|
|||||||
|
### Open `standalone.conf` Configuration File
|
||||||
|
```bash
|
||||||
|
vim /opt/jboss-eap-7.1/bin/standalone.conf
|
||||||
|
```
|
||||||
|
|
||||||
|
### Update `JAVA_OPTS` environment variable
|
||||||
|
Update `JAVA_OPTS` environment variable with configurations required to send data to SigNoz cloud in your configuration file.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
JAVA_OPTS="-javaagent:/<path>/opentelemetry-javaagent.jar
|
||||||
|
-Dotel.exporter.otlp.endpoint=https://ingest.{{REGION}}.signoz.cloud:443
|
||||||
|
-Dotel.exporter.otlp.headers="signoz-access-token={{SIGNOZ_INGESTION_KEY}}"
|
||||||
|
-Dotel.resource.attributes="service.name={{MYAPP}}""
|
||||||
|
```
|
||||||
|
|
||||||
|
<path> - update it to the path where you downloaded the Java JAR agent in previous step
|
||||||
|
|
||||||
|
|
||||||
|
### (Optional step) Write the output/logs of standalone.sh script to a file nohup.out as a background thread
|
||||||
|
```bash
|
||||||
|
/opt/jboss-eap-7.1/bin/standalone.sh > /opt/jboss-eap-7.1/bin/nohup.out &
|
||||||
|
|
||||||
|
```
|
@ -0,0 +1,92 @@
|
|||||||
|
### Setup OpenTelemetry Binary as an agent
|
||||||
|
|
||||||
|
### Step 1: Download otel-collector tar.gz
|
||||||
|
```bash
|
||||||
|
wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_darwin_arm64.tar.gz
|
||||||
|
|
||||||
|
### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder
|
||||||
|
```bash
|
||||||
|
mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_darwin_arm64.tar.gz -C otelcol-contrib
|
||||||
|
```
|
||||||
|
|
||||||
|
### Step 3: Create config.yaml in folder otelcol-contrib with the below content in it
|
||||||
|
```bash
|
||||||
|
receivers:
|
||||||
|
otlp:
|
||||||
|
protocols:
|
||||||
|
grpc:
|
||||||
|
endpoint: 0.0.0.0:4317
|
||||||
|
http:
|
||||||
|
endpoint: 0.0.0.0:4318
|
||||||
|
hostmetrics:
|
||||||
|
collection_interval: 60s
|
||||||
|
scrapers:
|
||||||
|
cpu: {}
|
||||||
|
disk: {}
|
||||||
|
load: {}
|
||||||
|
filesystem: {}
|
||||||
|
memory: {}
|
||||||
|
network: {}
|
||||||
|
paging: {}
|
||||||
|
process:
|
||||||
|
mute_process_name_error: true
|
||||||
|
mute_process_exe_error: true
|
||||||
|
mute_process_io_error: true
|
||||||
|
processes: {}
|
||||||
|
prometheus:
|
||||||
|
config:
|
||||||
|
global:
|
||||||
|
scrape_interval: 60s
|
||||||
|
scrape_configs:
|
||||||
|
- job_name: otel-collector-binary
|
||||||
|
static_configs:
|
||||||
|
- targets:
|
||||||
|
# - localhost:8888
|
||||||
|
processors:
|
||||||
|
batch:
|
||||||
|
send_batch_size: 1000
|
||||||
|
timeout: 10s
|
||||||
|
# Ref: https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/processor/resourcedetectionprocessor/README.md
|
||||||
|
resourcedetection:
|
||||||
|
detectors: [env, system] # Before system detector, include ec2 for AWS, gcp for GCP and azure for Azure.
|
||||||
|
# Using OTEL_RESOURCE_ATTRIBUTES envvar, env detector adds custom labels.
|
||||||
|
timeout: 2s
|
||||||
|
system:
|
||||||
|
hostname_sources: [os] # alternatively, use [dns,os] for setting FQDN as host.name and os as fallback
|
||||||
|
extensions:
|
||||||
|
health_check: {}
|
||||||
|
zpages: {}
|
||||||
|
exporters:
|
||||||
|
otlp:
|
||||||
|
endpoint: "ingest.{{REGION}}.signoz.cloud:443"
|
||||||
|
tls:
|
||||||
|
insecure: false
|
||||||
|
headers:
|
||||||
|
"signoz-access-token": "{{SIGNOZ_INGESTION_KEY}}"
|
||||||
|
logging:
|
||||||
|
verbosity: normal
|
||||||
|
service:
|
||||||
|
telemetry:
|
||||||
|
metrics:
|
||||||
|
address: 0.0.0.0:8888
|
||||||
|
extensions: [health_check, zpages]
|
||||||
|
pipelines:
|
||||||
|
metrics:
|
||||||
|
receivers: [otlp]
|
||||||
|
processors: [batch]
|
||||||
|
exporters: [otlp]
|
||||||
|
metrics/internal:
|
||||||
|
receivers: [prometheus, hostmetrics]
|
||||||
|
processors: [resourcedetection, batch]
|
||||||
|
exporters: [otlp]
|
||||||
|
traces:
|
||||||
|
receivers: [otlp]
|
||||||
|
processors: [batch]
|
||||||
|
exporters: [otlp]
|
||||||
|
logs:
|
||||||
|
receivers: [otlp]
|
||||||
|
processors: [batch]
|
||||||
|
exporters: [otlp]
|
||||||
|
```
|
||||||
|
|
||||||
|
|
@ -0,0 +1,10 @@
|
|||||||
|
After setting up the Otel collector agent, follow the steps below to instrumnet your JavaScript Application
|
||||||
|
|
||||||
|
#### Requirements
|
||||||
|
- Java 8 or higher
|
||||||
|
|
||||||
|
### Download otel java binary
|
||||||
|
|
||||||
|
```bash
|
||||||
|
wget https://github.com/open-telemetry/opentelemetry-java-instrumentation/releases/latest/download/opentelemetry-javaagent.jar
|
||||||
|
```
|
@ -0,0 +1,30 @@
|
|||||||
|
Once you are done intrumenting your Java application, you can run it using the below commands
|
||||||
|
|
||||||
|
### Step 1: Run OTel Collector
|
||||||
|
Run this command inside the `otelcol-contrib` directory that you created in the install Otel Collector step
|
||||||
|
|
||||||
|
```bash
|
||||||
|
./otelcol-contrib --config ./config.yaml &> otelcol-output.log & echo "$!" > otel-pid
|
||||||
|
```
|
||||||
|
### (Optional Step): View last 50 lines of `otelcol` logs
|
||||||
|
```bash
|
||||||
|
tail -f -n 50 otelcol-output.log
|
||||||
|
```
|
||||||
|
|
||||||
|
### (Optional Step): Stop `otelcol`
|
||||||
|
```bash
|
||||||
|
kill "$(< otel-pid)"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Step 2: Open `standalone.conf` Configuration File
|
||||||
|
```bash
|
||||||
|
vim /opt/jboss-eap-7.1/bin/standalone.conf
|
||||||
|
```
|
||||||
|
|
||||||
|
### Step 3: Update `JAVA_OPTS` environment variable
|
||||||
|
```bash
|
||||||
|
JAVA_OPTS="-javaagent:/<path>/opentelemetry-javaagent.jar"
|
||||||
|
```
|
||||||
|
|
||||||
|
<path> - update it to the path where you downloaded the Java JAR agent in previous step
|
||||||
|
|
@ -0,0 +1,21 @@
|
|||||||
|
### Install otel-collector in your Kubernetes infra
|
||||||
|
|
||||||
|
Add the SigNoz Helm Chart repository
|
||||||
|
```bash
|
||||||
|
helm repo add signoz https://charts.signoz.io
|
||||||
|
```
|
||||||
|
|
||||||
|
If the chart is already present, update the chart to the latest using:
|
||||||
|
```bash
|
||||||
|
helm repo update
|
||||||
|
```
|
||||||
|
|
||||||
|
Install the Kubernetes Infrastructure chart provided by SigNoz
|
||||||
|
```bash
|
||||||
|
helm install my-release signoz/k8s-infra \
|
||||||
|
--set otelCollectorEndpoint=ingest.{{REGION}}.signoz.cloud:443 \
|
||||||
|
--set otelInsecure=false \
|
||||||
|
--set signozApiKey={{SIGNOZ_INGESTION_KEY}} \
|
||||||
|
--set global.clusterName=<CLUSTER_NAME>
|
||||||
|
```
|
||||||
|
- Replace `<CLUSTER_NAME>` with the name of the Kubernetes cluster or a unique identifier of the cluster.
|
@ -0,0 +1,10 @@
|
|||||||
|
After setting up the Otel collector agent, follow the steps below to instrumnet your JavaScript Application
|
||||||
|
|
||||||
|
#### Requirements
|
||||||
|
- Java 8 or higher
|
||||||
|
|
||||||
|
### Download otel java binary
|
||||||
|
|
||||||
|
```bash
|
||||||
|
wget https://github.com/open-telemetry/opentelemetry-java-instrumentation/releases/latest/download/opentelemetry-javaagent.jar
|
||||||
|
```
|
@ -0,0 +1,10 @@
|
|||||||
|
Once you are done intrumenting your Java application, you can run it using the below command
|
||||||
|
|
||||||
|
```bash
|
||||||
|
java -javaagent:<path>/opentelemetry-javaagent.jar -jar {{MYAPP}}.jar
|
||||||
|
```
|
||||||
|
|
||||||
|
<path> - update it to the path where you downloaded the Java JAR agent in previous step
|
||||||
|
|
||||||
|
**Note:**
|
||||||
|
- In case you're dockerising your application, make sure to dockerise it along with OpenTelemetry instrumentation done in previous step.
|
@ -0,0 +1,9 @@
|
|||||||
|
#### Requirements
|
||||||
|
- Java 8 or higher
|
||||||
|
|
||||||
|
### Download otel java binary agent
|
||||||
|
|
||||||
|
```bash
|
||||||
|
wget https://github.com/open-telemetry/opentelemetry-java-instrumentation/releases/latest/download/opentelemetry-javaagent.jar
|
||||||
|
```
|
||||||
|
|
@ -0,0 +1,14 @@
|
|||||||
|
|
||||||
|
Once you are done intrumenting your Java application, you can run it using the below command
|
||||||
|
|
||||||
|
```bash
|
||||||
|
OTEL_RESOURCE_ATTRIBUTES=service.name={{MYAPP}} \
|
||||||
|
OTEL_EXPORTER_OTLP_HEADERS="signoz-access-token={{SIGNOZ_INGESTION_KEY}}" \
|
||||||
|
OTEL_EXPORTER_OTLP_ENDPOINT=https://ingest.{{REGION}}.signoz.cloud:443 \
|
||||||
|
java -javaagent:<path>/opentelemetry-javaagent.jar -jar {{MYAPP}}.jar
|
||||||
|
```
|
||||||
|
|
||||||
|
<path> - update it to the path where you downloaded the Java JAR agent in previous step
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -0,0 +1,93 @@
|
|||||||
|
### Setup OpenTelemetry Binary as an agent
|
||||||
|
|
||||||
|
### Step 1: Download otel-collector tar.gz
|
||||||
|
```bash
|
||||||
|
wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_linux_amd64.tar.gz
|
||||||
|
```
|
||||||
|
|
||||||
|
### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder
|
||||||
|
```bash
|
||||||
|
mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_linux_amd64.tar.gz -C otelcol-contrib
|
||||||
|
```
|
||||||
|
|
||||||
|
### Step 3: Create config.yaml in folder otelcol-contrib with the below content in it
|
||||||
|
```bash
|
||||||
|
receivers:
|
||||||
|
otlp:
|
||||||
|
protocols:
|
||||||
|
grpc:
|
||||||
|
endpoint: 0.0.0.0:4317
|
||||||
|
http:
|
||||||
|
endpoint: 0.0.0.0:4318
|
||||||
|
hostmetrics:
|
||||||
|
collection_interval: 60s
|
||||||
|
scrapers:
|
||||||
|
cpu: {}
|
||||||
|
disk: {}
|
||||||
|
load: {}
|
||||||
|
filesystem: {}
|
||||||
|
memory: {}
|
||||||
|
network: {}
|
||||||
|
paging: {}
|
||||||
|
process:
|
||||||
|
mute_process_name_error: true
|
||||||
|
mute_process_exe_error: true
|
||||||
|
mute_process_io_error: true
|
||||||
|
processes: {}
|
||||||
|
prometheus:
|
||||||
|
config:
|
||||||
|
global:
|
||||||
|
scrape_interval: 60s
|
||||||
|
scrape_configs:
|
||||||
|
- job_name: otel-collector-binary
|
||||||
|
static_configs:
|
||||||
|
- targets:
|
||||||
|
# - localhost:8888
|
||||||
|
processors:
|
||||||
|
batch:
|
||||||
|
send_batch_size: 1000
|
||||||
|
timeout: 10s
|
||||||
|
# Ref: https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/processor/resourcedetectionprocessor/README.md
|
||||||
|
resourcedetection:
|
||||||
|
detectors: [env, system] # Before system detector, include ec2 for AWS, gcp for GCP and azure for Azure.
|
||||||
|
# Using OTEL_RESOURCE_ATTRIBUTES envvar, env detector adds custom labels.
|
||||||
|
timeout: 2s
|
||||||
|
system:
|
||||||
|
hostname_sources: [os] # alternatively, use [dns,os] for setting FQDN as host.name and os as fallback
|
||||||
|
extensions:
|
||||||
|
health_check: {}
|
||||||
|
zpages: {}
|
||||||
|
exporters:
|
||||||
|
otlp:
|
||||||
|
endpoint: "ingest.{{REGION}}.signoz.cloud:443"
|
||||||
|
tls:
|
||||||
|
insecure: false
|
||||||
|
headers:
|
||||||
|
"signoz-access-token": "{{SIGNOZ_INGESTION_KEY}}"
|
||||||
|
logging:
|
||||||
|
verbosity: normal
|
||||||
|
service:
|
||||||
|
telemetry:
|
||||||
|
metrics:
|
||||||
|
address: 0.0.0.0:8888
|
||||||
|
extensions: [health_check, zpages]
|
||||||
|
pipelines:
|
||||||
|
metrics:
|
||||||
|
receivers: [otlp]
|
||||||
|
processors: [batch]
|
||||||
|
exporters: [otlp]
|
||||||
|
metrics/internal:
|
||||||
|
receivers: [prometheus, hostmetrics]
|
||||||
|
processors: [resourcedetection, batch]
|
||||||
|
exporters: [otlp]
|
||||||
|
traces:
|
||||||
|
receivers: [otlp]
|
||||||
|
processors: [batch]
|
||||||
|
exporters: [otlp]
|
||||||
|
logs:
|
||||||
|
receivers: [otlp]
|
||||||
|
processors: [batch]
|
||||||
|
exporters: [otlp]
|
||||||
|
```
|
||||||
|
|
||||||
|
|
@ -0,0 +1,10 @@
|
|||||||
|
After setting up the Otel collector agent, follow the steps below to instrumnet your JavaScript Application
|
||||||
|
|
||||||
|
#### Requirements
|
||||||
|
- Java 8 or higher
|
||||||
|
|
||||||
|
### Download otel java binary
|
||||||
|
|
||||||
|
```bash
|
||||||
|
wget https://github.com/open-telemetry/opentelemetry-java-instrumentation/releases/latest/download/opentelemetry-javaagent.jar
|
||||||
|
```
|
@ -0,0 +1,24 @@
|
|||||||
|
OOnce you are done intrumenting your Java application, you can run it using the below commands
|
||||||
|
|
||||||
|
### Step 1: Run OTel Collector
|
||||||
|
Run this command inside the `otelcol-contrib` directory that you created in the install Otel Collector step
|
||||||
|
|
||||||
|
```bash
|
||||||
|
./otelcol-contrib --config ./config.yaml &> otelcol-output.log & echo "$!" > otel-pid
|
||||||
|
```
|
||||||
|
### (Optional Step): View last 50 lines of `otelcol` logs
|
||||||
|
```bash
|
||||||
|
tail -f -n 50 otelcol-output.log
|
||||||
|
```
|
||||||
|
|
||||||
|
### (Optional Step): Stop `otelcol`
|
||||||
|
```bash
|
||||||
|
kill "$(< otel-pid)"
|
||||||
|
```
|
||||||
|
### Step 2: Run your application
|
||||||
|
```bash
|
||||||
|
java -javaagent:<path>/opentelemetry-javaagent.jar -jar {{MYAPP}}.jar
|
||||||
|
```
|
||||||
|
|
||||||
|
<path> - update it to the path where you downloaded the Java JAR agent in previous step
|
||||||
|
|
@ -0,0 +1,9 @@
|
|||||||
|
#### Requirements
|
||||||
|
- Java 8 or higher
|
||||||
|
|
||||||
|
### Download otel java binary agent
|
||||||
|
|
||||||
|
```bash
|
||||||
|
wget https://github.com/open-telemetry/opentelemetry-java-instrumentation/releases/latest/download/opentelemetry-javaagent.jar
|
||||||
|
```
|
||||||
|
|
@ -0,0 +1,14 @@
|
|||||||
|
|
||||||
|
Once you are done intrumenting your Java application, you can run it using the below command
|
||||||
|
|
||||||
|
```bash
|
||||||
|
OTEL_RESOURCE_ATTRIBUTES=service.name={{MYAPP}} \
|
||||||
|
OTEL_EXPORTER_OTLP_HEADERS="signoz-access-token={{SIGNOZ_INGESTION_KEY}}" \
|
||||||
|
OTEL_EXPORTER_OTLP_ENDPOINT=https://ingest.{{REGION}}.signoz.cloud:443 \
|
||||||
|
java -javaagent:<path>/opentelemetry-javaagent.jar -jar {{MYAPP}}.jar
|
||||||
|
```
|
||||||
|
|
||||||
|
<path> - update it to the path where you downloaded the Java JAR agent in previous step
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -0,0 +1,93 @@
|
|||||||
|
### Setup OpenTelemetry Binary as an agent
|
||||||
|
|
||||||
|
### Step 1: Download otel-collector tar.gz
|
||||||
|
```bash
|
||||||
|
wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_linux_arm64.tar.gz
|
||||||
|
```
|
||||||
|
|
||||||
|
### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder
|
||||||
|
```bash
|
||||||
|
mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_linux_arm64.tar.gz -C otelcol-contrib
|
||||||
|
```
|
||||||
|
|
||||||
|
### Step 3: Create config.yaml in folder otelcol-contrib with the below content in it
|
||||||
|
```bash
|
||||||
|
receivers:
|
||||||
|
otlp:
|
||||||
|
protocols:
|
||||||
|
grpc:
|
||||||
|
endpoint: 0.0.0.0:4317
|
||||||
|
http:
|
||||||
|
endpoint: 0.0.0.0:4318
|
||||||
|
hostmetrics:
|
||||||
|
collection_interval: 60s
|
||||||
|
scrapers:
|
||||||
|
cpu: {}
|
||||||
|
disk: {}
|
||||||
|
load: {}
|
||||||
|
filesystem: {}
|
||||||
|
memory: {}
|
||||||
|
network: {}
|
||||||
|
paging: {}
|
||||||
|
process:
|
||||||
|
mute_process_name_error: true
|
||||||
|
mute_process_exe_error: true
|
||||||
|
mute_process_io_error: true
|
||||||
|
processes: {}
|
||||||
|
prometheus:
|
||||||
|
config:
|
||||||
|
global:
|
||||||
|
scrape_interval: 60s
|
||||||
|
scrape_configs:
|
||||||
|
- job_name: otel-collector-binary
|
||||||
|
static_configs:
|
||||||
|
- targets:
|
||||||
|
# - localhost:8888
|
||||||
|
processors:
|
||||||
|
batch:
|
||||||
|
send_batch_size: 1000
|
||||||
|
timeout: 10s
|
||||||
|
# Ref: https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/processor/resourcedetectionprocessor/README.md
|
||||||
|
resourcedetection:
|
||||||
|
detectors: [env, system] # Before system detector, include ec2 for AWS, gcp for GCP and azure for Azure.
|
||||||
|
# Using OTEL_RESOURCE_ATTRIBUTES envvar, env detector adds custom labels.
|
||||||
|
timeout: 2s
|
||||||
|
system:
|
||||||
|
hostname_sources: [os] # alternatively, use [dns,os] for setting FQDN as host.name and os as fallback
|
||||||
|
extensions:
|
||||||
|
health_check: {}
|
||||||
|
zpages: {}
|
||||||
|
exporters:
|
||||||
|
otlp:
|
||||||
|
endpoint: "ingest.{{REGION}}.signoz.cloud:443"
|
||||||
|
tls:
|
||||||
|
insecure: false
|
||||||
|
headers:
|
||||||
|
"signoz-access-token": "{{SIGNOZ_INGESTION_KEY}}"
|
||||||
|
logging:
|
||||||
|
verbosity: normal
|
||||||
|
service:
|
||||||
|
telemetry:
|
||||||
|
metrics:
|
||||||
|
address: 0.0.0.0:8888
|
||||||
|
extensions: [health_check, zpages]
|
||||||
|
pipelines:
|
||||||
|
metrics:
|
||||||
|
receivers: [otlp]
|
||||||
|
processors: [batch]
|
||||||
|
exporters: [otlp]
|
||||||
|
metrics/internal:
|
||||||
|
receivers: [prometheus, hostmetrics]
|
||||||
|
processors: [resourcedetection, batch]
|
||||||
|
exporters: [otlp]
|
||||||
|
traces:
|
||||||
|
receivers: [otlp]
|
||||||
|
processors: [batch]
|
||||||
|
exporters: [otlp]
|
||||||
|
logs:
|
||||||
|
receivers: [otlp]
|
||||||
|
processors: [batch]
|
||||||
|
exporters: [otlp]
|
||||||
|
```
|
||||||
|
|
||||||
|
|
@ -0,0 +1,10 @@
|
|||||||
|
After setting up the Otel collector agent, follow the steps below to instrumnet your JavaScript Application
|
||||||
|
|
||||||
|
#### Requirements
|
||||||
|
- Java 8 or higher
|
||||||
|
|
||||||
|
### Download otel java binary
|
||||||
|
|
||||||
|
```bash
|
||||||
|
wget https://github.com/open-telemetry/opentelemetry-java-instrumentation/releases/latest/download/opentelemetry-javaagent.jar
|
||||||
|
```
|
@ -0,0 +1,24 @@
|
|||||||
|
OOnce you are done intrumenting your Java application, you can run it using the below commands
|
||||||
|
|
||||||
|
### Step 1: Run OTel Collector
|
||||||
|
Run this command inside the `otelcol-contrib` directory that you created in the install Otel Collector step
|
||||||
|
|
||||||
|
```bash
|
||||||
|
./otelcol-contrib --config ./config.yaml &> otelcol-output.log & echo "$!" > otel-pid
|
||||||
|
```
|
||||||
|
### (Optional Step): View last 50 lines of `otelcol` logs
|
||||||
|
```bash
|
||||||
|
tail -f -n 50 otelcol-output.log
|
||||||
|
```
|
||||||
|
|
||||||
|
### (Optional Step): Stop `otelcol`
|
||||||
|
```bash
|
||||||
|
kill "$(< otel-pid)"
|
||||||
|
```
|
||||||
|
### Step 2: Run your application
|
||||||
|
```bash
|
||||||
|
java -javaagent:<path>/opentelemetry-javaagent.jar -jar {{MYAPP}}.jar
|
||||||
|
```
|
||||||
|
|
||||||
|
<path> - update it to the path where you downloaded the Java JAR agent in previous step
|
||||||
|
|
@ -0,0 +1,9 @@
|
|||||||
|
#### Requirements
|
||||||
|
- Java 8 or higher
|
||||||
|
|
||||||
|
### Download otel java binary agent
|
||||||
|
|
||||||
|
```bash
|
||||||
|
wget https://github.com/open-telemetry/opentelemetry-java-instrumentation/releases/latest/download/opentelemetry-javaagent.jar
|
||||||
|
```
|
||||||
|
|
@ -0,0 +1,14 @@
|
|||||||
|
|
||||||
|
Once you are done intrumenting your Java application, you can run it using the below command
|
||||||
|
|
||||||
|
```bash
|
||||||
|
OTEL_RESOURCE_ATTRIBUTES=service.name={{MYAPP}} \
|
||||||
|
OTEL_EXPORTER_OTLP_HEADERS="signoz-access-token={{SIGNOZ_INGESTION_KEY}}" \
|
||||||
|
OTEL_EXPORTER_OTLP_ENDPOINT=https://ingest.{{REGION}}.signoz.cloud:443 \
|
||||||
|
java -javaagent:<path>/opentelemetry-javaagent.jar -jar {{MYAPP}}.jar
|
||||||
|
```
|
||||||
|
|
||||||
|
<path> - update it to the path where you downloaded the Java JAR agent in previous step
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -0,0 +1,93 @@
|
|||||||
|
### Setup OpenTelemetry Binary as an agent
|
||||||
|
|
||||||
|
### Step 1: Download otel-collector tar.gz
|
||||||
|
```bash
|
||||||
|
wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.79.0/otelcol-contrib_0.79.0_darwin_amd64.tar.gz
|
||||||
|
```
|
||||||
|
|
||||||
|
### Step 2: Extract otel-collector tar.gz to the `otelcol-contrib` folder
|
||||||
|
```bash
|
||||||
|
mkdir otelcol-contrib && tar xvzf otelcol-contrib_0.79.0_darwin_amd64.tar.gz -C otelcol-contrib
|
||||||
|
```
|
||||||
|
|
||||||
|
### Step 3: Create config.yaml in folder otelcol-contrib with the below content in it
|
||||||
|
```bash
|
||||||
|
receivers:
|
||||||
|
otlp:
|
||||||
|
protocols:
|
||||||
|
grpc:
|
||||||
|
endpoint: 0.0.0.0:4317
|
||||||
|
http:
|
||||||
|
endpoint: 0.0.0.0:4318
|
||||||
|
hostmetrics:
|
||||||
|
collection_interval: 60s
|
||||||
|
scrapers:
|
||||||
|
cpu: {}
|
||||||
|
disk: {}
|
||||||
|
load: {}
|
||||||
|
filesystem: {}
|
||||||
|
memory: {}
|
||||||
|
network: {}
|
||||||
|
paging: {}
|
||||||
|
process:
|
||||||
|
mute_process_name_error: true
|
||||||
|
mute_process_exe_error: true
|
||||||
|
mute_process_io_error: true
|
||||||
|
processes: {}
|
||||||
|
prometheus:
|
||||||
|
config:
|
||||||
|
global:
|
||||||
|
scrape_interval: 60s
|
||||||
|
scrape_configs:
|
||||||
|
- job_name: otel-collector-binary
|
||||||
|
static_configs:
|
||||||
|
- targets:
|
||||||
|
# - localhost:8888
|
||||||
|
processors:
|
||||||
|
batch:
|
||||||
|
send_batch_size: 1000
|
||||||
|
timeout: 10s
|
||||||
|
# Ref: https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/processor/resourcedetectionprocessor/README.md
|
||||||
|
resourcedetection:
|
||||||
|
detectors: [env, system] # Before system detector, include ec2 for AWS, gcp for GCP and azure for Azure.
|
||||||
|
# Using OTEL_RESOURCE_ATTRIBUTES envvar, env detector adds custom labels.
|
||||||
|
timeout: 2s
|
||||||
|
system:
|
||||||
|
hostname_sources: [os] # alternatively, use [dns,os] for setting FQDN as host.name and os as fallback
|
||||||
|
extensions:
|
||||||
|
health_check: {}
|
||||||
|
zpages: {}
|
||||||
|
exporters:
|
||||||
|
otlp:
|
||||||
|
endpoint: "ingest.{{REGION}}.signoz.cloud:443"
|
||||||
|
tls:
|
||||||
|
insecure: false
|
||||||
|
headers:
|
||||||
|
"signoz-access-token": "{{SIGNOZ_INGESTION_KEY}}"
|
||||||
|
logging:
|
||||||
|
verbosity: normal
|
||||||
|
service:
|
||||||
|
telemetry:
|
||||||
|
metrics:
|
||||||
|
address: 0.0.0.0:8888
|
||||||
|
extensions: [health_check, zpages]
|
||||||
|
pipelines:
|
||||||
|
metrics:
|
||||||
|
receivers: [otlp]
|
||||||
|
processors: [batch]
|
||||||
|
exporters: [otlp]
|
||||||
|
metrics/internal:
|
||||||
|
receivers: [prometheus, hostmetrics]
|
||||||
|
processors: [resourcedetection, batch]
|
||||||
|
exporters: [otlp]
|
||||||
|
traces:
|
||||||
|
receivers: [otlp]
|
||||||
|
processors: [batch]
|
||||||
|
exporters: [otlp]
|
||||||
|
logs:
|
||||||
|
receivers: [otlp]
|
||||||
|
processors: [batch]
|
||||||
|
exporters: [otlp]
|
||||||
|
```
|
||||||
|
|
||||||
|
|
@ -0,0 +1,10 @@
|
|||||||
|
After setting up the Otel collector agent, follow the steps below to instrumnet your JavaScript Application
|
||||||
|
|
||||||
|
#### Requirements
|
||||||
|
- Java 8 or higher
|
||||||
|
|
||||||
|
### Download otel java binary
|
||||||
|
|
||||||
|
```bash
|
||||||
|
wget https://github.com/open-telemetry/opentelemetry-java-instrumentation/releases/latest/download/opentelemetry-javaagent.jar
|
||||||
|
```
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user