国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

【容器云 UK8S】日志監(jiān)控方案:什么是Prometheus?怎么部署Prometheus?

Tecode / 2468人閱讀

摘要:客戶端庫,為需要監(jiān)控的服務(wù)生成相應(yīng)的并暴露給。根據(jù)配置文件,對(duì)接收到的警報(bào)進(jìn)行處理,發(fā)出告警。再創(chuàng)建一個(gè)來告訴需要監(jiān)控帶有為的背后的一組的。

什么是Prometheus

關(guān)于Prometheus

Prometheus 是一套開源的系統(tǒng)監(jiān)控報(bào)警框架。它的設(shè)計(jì)靈感源于 Google 的 borgmon 監(jiān)控系統(tǒng),由SoundCloud 在 2012 年創(chuàng)建,后作為社區(qū)開源項(xiàng)目進(jìn)行開發(fā),并于 2015 年正式發(fā)布。2016 年,Prometheus 正式加入 Cloud Native Computing Foundation(CNCF),成為受歡迎度僅次于 Kubernetes 的項(xiàng)目,目前已廣泛應(yīng)用于Kubernetes集群監(jiān)控系統(tǒng)中,大有成為Kubernetes集群監(jiān)控標(biāo)準(zhǔn)方案的趨勢(shì)。

Prometheus的優(yōu)勢(shì)

  • 強(qiáng)大的多維度數(shù)據(jù)模型:

    • 時(shí)間序列數(shù)據(jù)通過 metric 名和鍵值對(duì)來區(qū)分。
    • 所有的 metrics 都可以設(shè)置任意的多維標(biāo)簽。
    • 數(shù)據(jù)模型更隨意,不需要刻意設(shè)置為以點(diǎn)分隔的字符串。
    • 可以對(duì)數(shù)據(jù)模型進(jìn)行聚合,切割和切片操作。
    • 支持雙精度浮點(diǎn)類型,標(biāo)簽可以設(shè)為全 unicode。
  • 靈活而強(qiáng)大的查詢語句(PromQL):在同一個(gè)查詢語句,可以對(duì)多個(gè) metrics 進(jìn)行乘法、加法、連接、取分?jǐn)?shù)位等操作。
  • 易于管理: Prometheus server 是一個(gè)多帶帶的二進(jìn)制文件,可直接在本地工作,不依賴于分布式存儲(chǔ)。
  • 高效:平均每個(gè)采樣點(diǎn)僅占 3.5 bytes,且一個(gè) Prometheus server 可以處理數(shù)百萬的 metrics。
  • 動(dòng)態(tài)獲取:可以通過服務(wù)發(fā)現(xiàn)或者靜態(tài)配置去獲取監(jiān)控的 targets。
  • 使用 pull 模式采集時(shí)間序列數(shù)據(jù),可以避免有問題的服務(wù)器推送壞的 metrics。
  • 支持 push gateway 的方式把時(shí)間序列數(shù)據(jù)推送至 Prometheus server 端。
  • 多種可視化圖形界面。

Prometheus架構(gòu)及組件

圖片源于Prometheus官方文檔

上圖為Prometheus的架構(gòu)圖,包含了Prometheus的核心模塊及生態(tài)圈中的組件,簡(jiǎn)要介紹如下:

  • Prometheus Server: 用于收集和存儲(chǔ)時(shí)間序列數(shù)據(jù)。
  • Client Library: 客戶端庫,為需要監(jiān)控的服務(wù)生成相應(yīng)的 metrics 并暴露給 Prometheus server。當(dāng) Prometheus server 來 pull 時(shí),直接返回實(shí)時(shí)狀態(tài)的 metrics。
  • Push Gateway: 主要用于短期的 jobs。由于這類 jobs 存在時(shí)間較短,可能在 Prometheus 來 pull 之前就消失了。為此 jobs 可以直接向 Prometheus server 端推送它們的 metrics。這種方式主要用于服務(wù)層面的 metrics,對(duì)于機(jī)器層面的 metrices,建議使用 node exporter。
  • Exporters: 用于暴露已有的第三方服務(wù)的 metrics 給 Prometheus。
  • Alertmanager: 從 Prometheus server 端接收到 alerts 后,會(huì)去除重復(fù)數(shù)據(jù),分組,并路由到對(duì)應(yīng)的接受方式,發(fā)出報(bào)警。

工作原理

如上圖可見,Prometheus 的主要模塊包括:Prometheus server exporters Pushgateway PromQL Alertmanager 以及圖形界面,其大概的工作流程是:

  1. Prometheus server 定期從配置好的 jobs 或者 exporters 中拉 metrics,或者接收來自 Pushgateway 發(fā)過來的 metrics,或者從其他的 Prometheus server 中拉 metrics。
  2. Prometheus server 在本地存儲(chǔ)收集到的 metrics,并運(yùn)行已定義好的 alert.rules,記錄新的時(shí)間序列或者向 Alertmanager 推送警報(bào)。
  3. Alertmanager 根據(jù)配置文件,對(duì)接收到的警報(bào)進(jìn)行處理,發(fā)出告警。
  4. 在圖形界面中,可視化采集數(shù)據(jù)。

Prometheus 工作的核心,是使用 Pull (抓取)的方式去搜集被監(jiān)控對(duì)象的 Metrics 數(shù)據(jù)(監(jiān)控指標(biāo)數(shù)據(jù)),然后,再把這些數(shù)據(jù)保存在一個(gè) TSDB (時(shí)間序列數(shù)據(jù)庫,比如 OpenTSDB、InfluxDB 等)當(dāng)中,以便后續(xù)可以按照時(shí)間進(jìn)行檢索。

適用場(chǎng)景

Prometheus非常適合記錄純時(shí)間序列的數(shù)據(jù)。它既適用于面向服務(wù)器等硬件指標(biāo)的監(jiān)控,也適用于高動(dòng)態(tài)的面向服務(wù)架構(gòu)的監(jiān)控。對(duì)于現(xiàn)在流行的微服務(wù),Prometheus的多維度數(shù)據(jù)收集和數(shù)據(jù)篩選查詢語言也是非常的強(qiáng)大。Prometheus是為服務(wù)的可靠性而設(shè)計(jì)的,當(dāng)服務(wù)出現(xiàn)故障時(shí),它可以使你快速定位和診斷問題。它的搭建過程對(duì)硬件和服務(wù)沒有很強(qiáng)的依賴關(guān)系。

Prometheus重視可靠性,即使在故障情況下,您也可以隨時(shí)查看有關(guān)系統(tǒng)的可用統(tǒng)計(jì)信息。如果您需要100%的準(zhǔn)確度,例如按請(qǐng)求計(jì)費(fèi),Prometheus不是一個(gè)好的選擇,因?yàn)槭占臄?shù)據(jù)可能不夠詳細(xì)和完整。

總之,在需要高可用性的業(yè)務(wù)場(chǎng)景,Prometheus是一個(gè)非常好的選擇,但對(duì)于高精度、高準(zhǔn)確率的業(yè)務(wù)場(chǎng)景,Prometheus并非最佳選擇。

核心概念

為了在 Prometheus 的配置和使用中可以更加順暢,我們對(duì) Prometheus 中的數(shù)據(jù)模型、metric 類型以及 instance 和 job 等概念做個(gè)簡(jiǎn)要介紹。

數(shù)據(jù)模型

Prometheus 中存儲(chǔ)的數(shù)據(jù)為時(shí)間序列,是由 metric 的名字和一系列的標(biāo)簽(鍵值對(duì))唯一標(biāo)識(shí)的,不同的標(biāo)簽則代表不同的時(shí)間序列。

  • metric 名字:該名字應(yīng)該具有語義,一般用于表示 metric 的功能,例如:http_requests_total 表示 http 請(qǐng)求的總數(shù)。其中,metric 名字由 ASCII 字符,數(shù)字,下劃線,以及冒號(hào)組成,且必須滿足正則表達(dá)式 a-zA-Z_:*。
  • 標(biāo)簽:使同一個(gè)時(shí)間序列有了不同維度的識(shí)別。例如 http_requests_total{method="Get"} 表示所有 http 請(qǐng)求中的 Get 請(qǐng)求。當(dāng) method="post" 時(shí),則為新的一個(gè) metric。標(biāo)簽中的鍵由 ASCII 字符,數(shù)字,以及下劃線組成,且必須滿足正則表達(dá)式 a-zA-Z_:*。
  • 樣本:實(shí)際的時(shí)間序列,每個(gè)序列包括一個(gè) float64 的值和一個(gè)毫秒級(jí)的時(shí)間戳。
  • 格式: 如http_requests_total{method="POST"endpoint="/api/tracks"}。

metric 類型

Prometheus 客戶端庫主要提供四種主要的 metric 類型,分別如下:

  1. Counter

一種累加的 metric,典型的應(yīng)用如:請(qǐng)求的個(gè)數(shù),結(jié)束的任務(wù)數(shù), 出現(xiàn)的錯(cuò)誤數(shù)等等。
例如,查詢 http_requests_total{method="get" job="kubernetes-nodes" handler="prometheus"} 返回 8,10 秒后,再次查詢,則返回 14。

  1. Gauge

一種常規(guī)的 metric,典型的應(yīng)用如:溫度,運(yùn)行的 goroutines 的個(gè)數(shù)。例如:go_goroutines{instance="10.9.81.55" job="kubernetes-nodes"} 返回值 147,10 秒后返回 124。

  1. Histogram

可以理解為柱狀圖,典型的應(yīng)用如:請(qǐng)求持續(xù)時(shí)間,響應(yīng)大小。可以對(duì)觀察結(jié)果采樣,分組及統(tǒng)計(jì)。
例如,查詢 http_request_duration_microseconds_sum{job="kubernetes-nodes" handler="prometheus"} 時(shí),返回結(jié)果如下:

  1. Summary

類似于 Histogram 典型的應(yīng)用如:請(qǐng)求持續(xù)時(shí)間,響應(yīng)大小。提供觀測(cè)值的 count 和 sum 功能。提供百分位的功能,即可以按百分比劃分跟蹤結(jié)果。

instance&job

instance: 一個(gè)多帶帶 scrape 的目標(biāo), 一般對(duì)應(yīng)于一個(gè)進(jìn)程。

jobs: 一組同類型的 instances

例如,一個(gè) api-server 的 job 可以包含4個(gè) instances:

  • job: api-server

    • instance 1: 1.2.3.4:5670
    • instance 2: 1.2.3.4:5671
    • instance 3: 1.2.3.4:5672
    • instance 4: 1.2.3.4:5673

當(dāng) scrape 目標(biāo)時(shí),Prometheus 會(huì)自動(dòng)給這個(gè) scrape 的時(shí)間序列附加一些標(biāo)簽以便更好的分別,例如:instance,job。

部署Prometheus

前言

對(duì)于一套Kubernetes集群而言,需要監(jiān)控的對(duì)象大致可以分為以下幾類:

  • Kubernetes系統(tǒng)組件:Kubernetes內(nèi)置的系統(tǒng)組件一般有apiserver、controller-manager、etcd、kubelet等,為了保證集群正常運(yùn)行,我們需要實(shí)時(shí)知曉其當(dāng)前的運(yùn)行狀態(tài)。
  • 底層基礎(chǔ)設(shè)施: Node節(jié)點(diǎn)(虛擬機(jī)或物理機(jī))的資源狀態(tài)、內(nèi)核事件等。
  • Kubernetes對(duì)象: 主要是Kubernetes中的工作負(fù)載對(duì)象,如Deployment、DaemonSet、Pod等。
  • 應(yīng)用指標(biāo): 應(yīng)用內(nèi)部需要關(guān)心的數(shù)據(jù)指標(biāo),如httpRequest。

部署Prometheus

在Kubernetes中部署Prometheus,除了手工方式外,CoreOS開源了Prometheus-Operator以及kube-Prometheus項(xiàng)目,使得在K8S中安裝部署Prometheus變得異常簡(jiǎn)單。下面我們介紹下如何在UK8S中部署Kube-Prometheus。

1、關(guān)于Prometheus-Operator

Prometheus-operator的本職就是一組用戶自定義的CRD資源以及Controller的實(shí)現(xiàn),Prometheus Operator這個(gè)controller有BRAC權(quán)限下去負(fù)責(zé)監(jiān)聽這些自定義資源的變化,并且根據(jù)這些資源的定義自動(dòng)化的完成如Prometheus Server自身以及配置的自動(dòng)化管理工作。

在K8S中,監(jiān)控metrics基本最小單位都是一個(gè)Service背后的一組pod,對(duì)應(yīng)Prometheus中的target,所以prometheus-operator抽象了對(duì)應(yīng)的CRD類型" ServiceMonitor ",這個(gè)ServiceMonitor通過 sepc.selector.labes來查找對(duì)應(yīng)的Service及其背后的Pod或endpoints,通過sepc.endpoint來指明Metrics的url路徑。
以下面的CoreDNS舉例,需要pull的Target對(duì)象Namespace為kube-system,kube-app是他們的labels,port為metrics。

apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  labels:
    k8s-app: coredns
  name: coredns
  namespace: monitoring
spec:
  endpoints:
  - bearerTokenFile: /var/run/secrets/kubernetes.io/serviceaccount/token
    interval: 15s
    port: metrics
  jobLabel: k8s-app
  namespaceSelector:
    matchNames:
    - kube-system
  selector:
    matchLabels:
      k8s-app: kube-dns

2、準(zhǔn)備工作

ssh到任意一臺(tái)Master節(jié)點(diǎn),克隆kube-prometheus項(xiàng)目。該項(xiàng)目源自CoreOS開源的kube-prometheus,與原始項(xiàng)目相比,主要作為以下優(yōu)化:

  • 將Prometheus和AlbertManager的數(shù)據(jù)存儲(chǔ)介質(zhì)由emptyDir改為UDisk,提升穩(wěn)定性,避免數(shù)據(jù)丟失;
  • 將鏡像源統(tǒng)一修改為UHub,避免鏡像拉取失敗的情況出現(xiàn);
  • 新增UK8S專屬文件目錄,用于配置監(jiān)控controller-manager、schduler、etcd;
  • 將執(zhí)行文件按目錄劃分,便于修改及閱讀。
yum install git -y
git clone --depth=1 -b kube-prometheus https://github.com/ucloud/uk8s-demo.git

3、修改UK8S專屬文件配置參數(shù)

在manifests目錄下有UK8S目錄,這批配置文件主要用于為UK8S中的controller-manager、schduler、etcd手動(dòng)創(chuàng)建endpoints和svc,便于Prometheus Server通過ServiceMonitor來采集這三個(gè)組件的監(jiān)控?cái)?shù)據(jù)。

cd /uk8s-demo/manifests/uk8s
# 修改以下兩個(gè)文件,將其中的IP替換為你自己UK8S Master節(jié)點(diǎn)的內(nèi)網(wǎng)IP
vi controllerManagerAndScheduler_ep.yaml
vi etcd_ep.yaml

4、 備注

上面提到要修改controllerManagerAndScheduler_ep.yaml和etcd_ep.yaml這兩個(gè)文件,這里解釋下原因。
由于UK8S的ETCD、Scheduler、Controller-Manager都是通過二進(jìn)制部署的,為了能通過配置"ServiceMonitor"實(shí)現(xiàn)Metrics的抓取,我們必須要為其在K8S中創(chuàng)建一個(gè)SVC對(duì)象,但由于這三個(gè)組件都不是Pod,因此我們需要手動(dòng)為其創(chuàng)建Endpoints。

apiVersion: v1
kind: Endpoints
metadata:
  labels:
    k8s-app: etcd
  name: etcd
  namespace: kube-system
subsets:
- addresses:
  - ip: 10.7.35.44 # 替換成master節(jié)點(diǎn)的內(nèi)網(wǎng)IP
    nodeName: etc-master2
  ports:
  - name: port
    port: 2379
    protocol: TCP
- addresses:
  - ip: 10.7.163.60 # 同上
    nodeName: etc-master1
  ports:
  - name: port
    port: 2379
    protocol: TCP
- addresses:
  - ip: 10.7.142.140 #同上
    nodeName: etc-master3
  ports:
  - name: port
    port: 2379
    protocol: TCP

5、部署Prometheus Operator

先創(chuàng)建一個(gè)名為monitor的NameSpace,Monitor創(chuàng)建成功后,直接部署Operator,Prometheus Operateor以Deployment的方式啟動(dòng),并會(huì)創(chuàng)建前面提到的幾個(gè)CRD對(duì)象。

# 創(chuàng)建Namespace
kubectl apply -f  00namespace-namespace.yaml
# 創(chuàng)建Secret,給到Prometheus Server抓取ETCD數(shù)據(jù)時(shí)使用
kubectl -n monitoring create secret generic etcd-certs --from-file=/etc/kubernetes/ssl/ca.pem --from-file=/etc/kubernetes/ssl/etcd.pem --from-file=/etc/kubernetes/ssl/etcd-key.pem
# 創(chuàng)建Operator
kubectl apply -f operator/
# 查看operator啟動(dòng)狀態(tài)
kubectl get po -n monitoring
# 查看CRD
kubectl get crd -n monitoring

6、部署整套CRD

比較關(guān)鍵的有Prometheus Server、Grafana、 AlertManager、ServiceMonitor、Node-Exporter等,這些鏡像已全部修改為UHub官方鏡像,因此拉取速度相對(duì)比較快。

kubectl apply -f adapter/ 
kubectl apply -f alertmanager/ 
kubectl apply -f node-exporter/ 
kubectl apply -f kube-state-metrics/ 
kubectl apply -f grafana/ 
kubectl apply -f prometheus/ 
kubectl apply -f serviceMonitor/
kubectl apply -f uk8s/

我們可以通過以下命令來查看應(yīng)用拉取狀態(tài)。

kubectl -n monitoring get po

由于默認(rèn)所有的SVC 類型均為ClusterIP,我們將其改為L(zhǎng)oadBalancer,方便演示。

 kubectl edit svc/prometheus-k8s -n monitoring
# 修改為type: LoadBalancer
[root@10-9-52-233 manifests]# kubectl get svc -n monitoring
# 獲取到Prometheus Server的EXTERNAL-IP及端口

可以看到,所有K8S組件的監(jiān)控指標(biāo)均已獲取到。

7、監(jiān)控應(yīng)用指標(biāo)

我們先來部署一組Pod及SVC,該鏡像里的主進(jìn)程會(huì)在8080端口上輸出metrics信息。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: example-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: example-app
  template:
    metadata:
      labels:
        app: example-app
    spec:
      containers:
      - name: example-app
        image: uhub.service.ucloud.cn/uk8s_public/instrumented_app:latest
        ports:
        - name: web
          containerPort: 8080
---
kind: Service
apiVersion: v1
metadata:
  name: example-app
  labels:
    app: example-app
spec:
  selector:
    app: example-app
  ports:
  - name: web
    port: 8080

再創(chuàng)建一個(gè)ServiceMonitor來告訴prometheus server需要監(jiān)控帶有l(wèi)abel為app: example-app的svc背后的一組pod的metrics。

apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: example-app
  labels:
    team: frontend
spec:
  selector:
    matchLabels:
      app: example-app
  endpoints:
  - port: web

打開瀏覽器訪問Prometheus Server,進(jìn)入target發(fā)現(xiàn)已經(jīng)監(jiān)聽起來了,對(duì)應(yīng)的config里也有配置生成和導(dǎo)入。

8、說明

該文檔只適用于kubernetes 1.14以上的版本,如果你的kubernetes版本為1.14以下,可以使用release-0.1.

實(shí)時(shí)文檔歡迎訪問https://docs.ucloud.cn/uk8s/monitor/prometheus/README

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/126277.html

相關(guān)文章

  • 容器 UK8S日志監(jiān)控方案監(jiān)控中心操作指南之監(jiān)控中心概述,開啟監(jiān)控中心,添加監(jiān)控目標(biāo)和添加接

    摘要:添加接收人監(jiān)控中心支持添加郵箱及微信兩種告警,需要注意的是,添加郵箱告警的話,需要預(yù)先配置發(fā)件服務(wù)器。由于監(jiān)控中心配置了一條告警規(guī)則,只要企業(yè)微信的信息填寫正確,一般分鐘以內(nèi)均可從企業(yè)微信中獲取到告警信息。監(jiān)控中心概述監(jiān)控中心是UK8S提供的產(chǎn)品化監(jiān)控方案,提供基于Prometheus的產(chǎn)品解決方案,涵蓋Prometheus集群的全生命周期管理,以及告警規(guī)則配置、報(bào)警設(shè)置等功能,省去了自行搭...

    Tecode 評(píng)論0 收藏0
  • 拉勾網(wǎng)基于 UK8S平臺(tái)的容器化改造實(shí)踐

    摘要:宋體本文從拉勾網(wǎng)的業(yè)務(wù)架構(gòu)日志采集監(jiān)控服務(wù)暴露調(diào)用等方面介紹了其基于的容器化改造實(shí)踐。宋體此外,拉勾網(wǎng)還有一套自研的環(huán)境的業(yè)務(wù)發(fā)布系統(tǒng),不過這套發(fā)布系統(tǒng)未適配容器環(huán)境。寫在前面 拉勾網(wǎng)于 2019 年 3 月份開始嘗試將生產(chǎn)環(huán)境的業(yè)務(wù)從 UHost 遷移到 UK8S,截至 2019 年 9 月份,QA 環(huán)境的大部分業(yè)務(wù)模塊已經(jīng)完成容器化改造,生產(chǎn)環(huán)境中,后臺(tái)管理服務(wù)已全部遷移到 UK8...

    CoorChice 評(píng)論0 收藏0
  • 容器UK8S】新手指導(dǎo)

    摘要:詳細(xì)請(qǐng)見產(chǎn)品價(jià)格產(chǎn)品概念使用須知名詞解釋漏洞修復(fù)記錄集群節(jié)點(diǎn)配置推薦模式選擇產(chǎn)品價(jià)格操作指南集群創(chuàng)建需要注意的幾點(diǎn)分別是使用必讀講解使用需要賦予的權(quán)限模式切換的切換等。UK8S概覽UK8S是一項(xiàng)基于Kubernetes的容器管理服務(wù),你可以在UK8S上部署、管理、擴(kuò)展你的容器化應(yīng)用,而無需關(guān)心Kubernetes集群自身的搭建及維護(hù)等運(yùn)維類工作。了解使用UK8S為了讓您更快上手使用,享受UK...

    Tecode 評(píng)論0 收藏0
  • UK8S 集群常見問題 容器 UK8S

    摘要:為什么在節(jié)點(diǎn)直接起容器網(wǎng)絡(luò)不通為什么在節(jié)點(diǎn)直接起容器網(wǎng)絡(luò)不通為什么在節(jié)點(diǎn)直接起容器網(wǎng)絡(luò)不通使用自己的插件,而直接用起的容器并不能使用該插件,因此網(wǎng)絡(luò)不通。 UK8S 集群常見問題本篇目錄1. UK8S 完全兼容原生 Kubernetes API嗎?2. UK8S 人工支持3. UK8S對(duì)Node上發(fā)布的容器有限制嗎?如何修改?4. 為什么我的容器一起來就退出了?5. Docker 如何調(diào)整日...

    ernest.wang 評(píng)論0 收藏1762
  • 樂心醫(yī)療的 Kubernetes平臺(tái)建設(shè)實(shí)踐

    摘要:宋體自年被開源以來,很快便成為了容器編排領(lǐng)域的標(biāo)準(zhǔn)。宋體年月,樂心醫(yī)療的第一個(gè)生產(chǎn)用集群正式上線。所以于年推出后,樂心醫(yī)療的運(yùn)維團(tuán)隊(duì)在開會(huì)討論之后一致決定盡快遷移到。Kubernetes 自 2014 年被 Google 開源以來,很快便成為了容器編排領(lǐng)域的標(biāo)準(zhǔn)。因其支持自動(dòng)化部署、大規(guī)模可伸縮和容器化管理等天然優(yōu)勢(shì),已經(jīng)被廣泛接納。但由于 Kubernetes 本身的復(fù)雜性,也讓很多企業(yè)的...

    testHs 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<