2019-06

6.3

  1. mib browser的使用
    載入mib文件,樹狀分析oid
    image.png
    分到最細的oid有名字,有介紹,有oid具體值
    image.png
    能夠是oid也能夠是字符串
    image.png
  2. 模板定義自動發現規則
    1.建立自定義發現規則
    image.png
    image.png前端

    2.設置監控項原型
    image.png
    image.pngjava

6.4

item keypython

proc.num[ , , , ]
user爲主機的用戶名, cmdline爲ps-ef查詢出的進程信息描述
在weblogic中,可使用它的java進程目錄是否在進程中存在來判斷weblogic是否掛掉
linux

6.5

image.png

6.10

  1. zabbix media mediatype user.addmedia
    image.png
  2. zabbix 採集器(zabbix trapper)
    zabbix_sender -z 192.168.1.66 -p 10051 -s 'oracle' -k 'version' -o 'ok' -vv
    image.png
  3. 自動發現規則
    image.png
  4. 企業微信的用戶列表獲取
    文檔 https://work.weixin.qq.com/api/doc#90000/90135/90664
    image.png
  5. 問題
    image.png
  6. py腳本能夠像shell腳本同樣 ./xxx.py執行
    image.png
  7. xshell
    image.png
  8. py2 和 py3 的區別
    datetime.datetime.timestamp(datetime.datetime.now()) 在3中能用,2 中不能用

6.11

  1. openpyxl
    image.png
  2. zabbix
    image.png

6.12

1.字典操做
image.png
image.pnggit

  1. python與 oracle客戶端的關係
    image.pngweb

    6.13

    image.png
    image.png

6.14

  1. 低版本的zabbix server 沒法監控高版本的zabbix agent 反之,高版本的server能夠監控agent
  2. excel類中的fill是對[]中指定的列的值進行判斷,可在format_cell方法中編輯邏輯,對示警度進行範圍指定
    check 是一個字典,指定了列數和值,與fill配合使用
  3. agent的配置
    HostMetadataItem=system.uname
    應用:主機元數據,應用在自動註冊的動做上
    image.png
    image.png
    syste.uname >>> Linux zabbix 3.10.0-327.el7.x86_64 #1 SMP Thu Nov 19 22:10:57 UTC 2015 x86_64redis

    6.17

    orm中建立新對象,create get_or_create() 對於NOT NULL的字段,不給他賦值也能建立? 爲啥?shell

es 用索引中的內容來匹配相應的索引,再刪除。數據庫

POST twitter/_delete_by_query
{
  "query": { 
    "match": {
      "message": "some message"
    }
  }
}

6.18

  1. 經過刪除原文件夾,增長新文件夾的方式來更新相關代碼,django沒有自動重啓,debug也開的呢,爲啥?
  2. screen命令的使用django

    screen -r monitor 進入運行monitor進程的screen,進入屏幕後,就跟直接運行同樣,相似於windows的虛擬桌面,在一臺主機上開了第二個linux屏幕。
    在screen內,ctrl + a +d 退出當前屏幕,

  3. datetime.datetime.today() >> datetime.datetime(2019, 6, 18, 17, 59, 9, 748551)
    datetime.date.today() >> datetime.date(2019, 6, 18)
  4. es的快照在恢復時,需保證這條索引已經被刪除,才能恢復成功

    6.19

  5. django遷移模型的時候,能夠指定單個app。
    在遷移logminer的時候,python manager.py makemigartions logminer.esbackup 遷移出錯。logminer的models包含了底下全部子應用的models,
    解決:使用 python manager.py makemigartions logminer 不指定下一層的應用了。
  6. tzinfo的問題。datetime對象是能夠比較大小的。

    6.20

  7. django中user類的指定,drf中的token的使用,此token使用key做爲主鍵,
class Token(models.Model):
    """
    The default authorization token model.
    """
    key = models.CharField("Key", max_length=40, primary_key=True)
    user = models.ForeignKey(
        settings.AUTH_USER_MODEL, related_name="auth_token",
        on_delete=models.CASCADE, verbose_name="User"
    )
    created = models.DateTimeField("Created", auto_now_add=True)

    class Meta:
        db_table = 'token'
        verbose_name = "Token"
        verbose_name_plural = "Tokens"

    def save(self, *args, **kwargs):
        if not self.key:
            self.key = self.generate_key()
        return super(Token, self).save(*args, **kwargs)

    def generate_key(self):
        return binascii.hexlify(os.urandom(20)).decode()

    def __str__(self):
        return self.key
  1. 在建立django項目時,名稱不能有特殊字符,使用xx-xx,提示名字不規範,
    在建立項目時,後面能夠指定路徑,在git上拉下來建立的倉庫,進入倉庫目錄,django-admin startproject xxxxx . 注意這個 . 指的就是在當前目錄下建立項目
  2. calendar 日曆模塊
    https://blog.csdn.net/tz_zs/article/details/86629959
    使用此腳本獲取整年月份及天數,經過一個api來獲取節假日
import calendar
import datetime
import json

import requests

tmp = {}
year = 2019
for i in range(1, 13):
    days = calendar.monthcalendar(year=2019, month=i)
    for k in days:
        for v in k:
            if v != 0:
                if i < 10:

                    if v < 10:
                        tmp[int(str(year) + '0' + str(i) + '0' + str(v))] = ''
                    else:
                        tmp[int(str(year) + '0' + str(i) + str(v))] = ''
                else:
                    if v < 10:
                        tmp[int(str(year) + str(i) + '0' + str(v))] = ''
                    else:
                        tmp[int(str(year) + str(i) + str(v))] = ''

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36"
}
# 返回數據:工做日對應結果爲 0, 休息日對應結果爲3, 節假日對應的結果爲1

for k in tmp.keys():
    url = 'http://api.goseek.cn/Tools/holiday?date=%d' % k
    res = requests.get(url=url, headers=headers)
    if res.status_code == 200:
        data = json.loads(res.text)['data']
        if data == 0:
            tmp[k] = 0
        elif data == 1:
            tmp[k] = 1
        elif data == 3:
            tmp[k] = 3

with open('%s年節假日對照表.txt'%datetime.date.today().year, 'w') as f:
    f.write(json.dumps(str))

這個api可能存在訪問不良,還須要多加判斷,

  1. 在配置django項目,沒注意哪一個配置項除了問題,致使報錯
    django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet.
    不知道啥狀況,從新刪了走一次好了。
  2. 把字典寫入文件的時候能夠直接寫入字符串 str(dict),從文件中讀取也是讀取的字符串,要繼續使用字典格式,可使用eval (eval(str)) >>>> 將字符串類型的dict轉換回來。雖然可取,但仍是使用json的轉換把
  3. and or的使用
    image.png
    使用and 起到了兩層if的做用,先對and前的條件進行判斷,經過在對and後的條件進行判斷,兩個都過變量獲得and後的值,若是兩個條件中有一個不通,變量就獲得or後的值,通常在變量初始化好用

    6.21

  4. django模型的datefield字段自動增長的時間,默認是以utc走的。datefield字段能夠置爲空null=True,在模型類中要更新這個字段可使用datetime對象,在存入數據庫的時候,django會自動作轉換,例如當前是2019年6月21日14:18:39,存入時就轉爲utc時間2019年6月21日06:18:39,
    xxx.objects.filter(id=1).update(updatetime = datetime.datetime.today() )
    另外,update能夠同時更新好幾個字段。
  5. shell 腳本使用$數字來接收外部傳入的參數,0爲腳本自己,1爲第一個參數,2爲第二個參數。以此類推,shell中的判等也是使用== !=表示不等
    shell中的if判斷,中括號中要有空格
if [ $1 == shell ]
then
xxxxx要作的事
fi
  1. 當使用一個標記來判斷使用哪一個函數,能夠把這個標記做爲函數名來傳入,使用eval來定義一個函數變量,最後加括號執行,
def a():
  pass
def b():
  pass
def c():
  pass
func = eval(var)
var = 'a'傳入時。func 等價於 a函數的內存地址
func() 等價於 a(),調用函數

6.24

  1. 不要在windows上玩celery,不要在windows上玩celery,不要在windows上玩celery,否則死都不知道怎麼死的。搞bug搞得頭大。
    image.png

報錯
image.png
解決方案:
第一種: Try to uninstall celery 4.1.0 and replace to 3.1.24
第二種: pip install eventlet, 啓動celeryworker時: celery -A celery_app worker --loglevel=info -P eventlet

@app.task
def add(x, y):
    time.sleep(3)
    return x + y
import task

if __name__ == '__main__':
    # 以前這樣寫,直接就執行 函數
    task.add()
    # 如今把函數添加到執行隊列中,參數寫在delay中
    # result不是函數的執行結果,他是個對象
    # delay是延遲執行,在調用執行的
     方式一:
       result = task.add.delay(2, 3)
     方式二:
        result = task.add.apply_async(args=[4, 3], eta=task_time)
        跟delay差很少
    # 當即執行的,
    # task.add.s()(2,3)
    # 這個任務惟一的id
    print(result.id)

查看任務結果
celery任務執行結果又九種狀態,

from celery.result import AsyncResult

from task import app
# 用獲取到的任務id,指定任務名稱
async = AsyncResult(id='ac2a7e52-ef66-4caa-bffd-81414d869f85', app=app)

if async.successful():
    # successful()方法是AsyncResult對狀態的封裝,實際上就是任務執行完獲得的對象的state == 'SUCCESS'。
    # 任務執行的結果,也就是返回值
    # 這裏的get有個坑,他會等待任務就緒,也就是說,任務不就緒的話會一直卡住,
    result = async.get()
    print(result)
elif async.failed(): #是FAILED的封裝
    print('執行失敗')
elif async.status == 'PENDING':
    print('任務等待中被執行')
elif async.status == 'RETRY':
    print('任務異常後正在重試')
elif async.status == 'STARTED':
    print('任務已經開始被執行')

執行命令
celery worker -A celery_app_task -l info

  1. 信息發送服務,不只僅只是把任務扔給celery執行,還要查看執行結果,對不成功的任務要重試,還有發送郵件這些的,若是網絡不通暢,鏈接服務器就失敗的,就別提發送了,因此,要對容易出現問題的地方添加劇試操做。以確保信息可以成功發送出去。
    並且還要考慮celery執行任務的特殊狀況,例如不少任務擠進去但立馬執行不了,該如何處理,
  2. drf的token驗證機制
    django 的 MIDDLEWARE 中包含的如下兩個 MIDDLEWARE

    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    能夠在一個 request 進來的時候,將request裏的 cookie 裏面的 session_id 轉換成咱們的 user !!!!! 也就是咱們以前看到的 request.user 。
    配置drf的中間件

REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework.authentication.BasicAuthentication',
'rest_framework.authentication.SessionAuthentication',
)}

官方文檔顯示 restful 提供的 auth 有三種 :

BasicAuthentication 、 TokenAuthentication 、 SessionAuthentication 。

SessionAuthentication :跟django中的機制是同樣的, 經常使用於瀏覽器,
由於瀏覽器會自動設置 cookie ,並將他的 cooike 和session 帶到服務器,
因此先後端分離的系統用這種機制比較少見,可是仍是能夠作。

TokenAuthentication : 是須要重點關注的,使用他前 ,必須先將 'rest_framework.authtoken'
添加到 django 的 INSTALLED_APPS 中。
INSTALLED_APPS = ( ... 'rest_framework.authtoken' )
這個tokenauth會給咱們建立一張表,外鍵關聯到user表,凡有表的app都要加入到app中,否則不會生成表。
遷移
python manage.py makemigrations
python manage.py migrate
使用python manage.py createsuperuser 建立超級用戶
from rest_framework.authtoken.models import Token
token須要咱們本身建立,使用Token.objects.create(user=self.request.user)
表中的key字段就是咱們要的token

此時,前端在訪問的時候就可使用這個token來表述用戶身份了
HTTP頭中
Authorization: Token xxxxxxxxx 注意token後的空格,key通常40長

settings文件中配置REST_FRAMEWORK

REST_FRAMEWORK = {

'DEFAULT_AUTHENTICATION_CLASSES': (

'rest_framework.authentication.BasicAuthentication',
'rest_framework.authentication.SessionAuthentication',
\#token驗證
'rest_framework.authentication.TokenAuthentication',)}

此時,就能夠在視圖中添加驗證類,
from rest_framework.authentication import TokenAuthentication(或者IsAuthentication都行)
這樣,就把django自帶的token用起來了

缺點:
1.這個token是存在服務器中的,若是一個分佈式系統要用同一套的驗證系統,就會出現問題。除非兩個服務器有同一份用戶數據,

  1. 這個token 是沒有過時時間的,並且泄露了別人能夠一直用。

6.25

  1. Django中解決redis-py versions 3.2.0 or later. You have 2.10.6
    http://www.yanup.cn/article/13
  2. 從數據庫中取出的參數信息,更改數據庫中的數據,若是當下參數沒有變動過來,考慮緩存中的數據,清一下試試就好,
  3. 在django-admin中配置參數,若是參數中混有換行符\n,前端在往數據庫中存儲的時候自動加上了轉義符\,因此,當要使用這個參數進行splitlines()的時候,多是切割不成功的。
    解決:分開配置各個參數,不放到一個字符串中。
  4. 問題:要根據celery的結果狀態來保存發送任務的記錄,不知道該怎麼使用這個狀態,看了看celery的chord函數,只是將前一個celery任務的結果做爲後一個celery任務的傳入參數,以爲仍是少了狀態的判斷,可能會在記錄的時候出現錯誤。
    不過celery號稱每分鐘解決百萬級任務,這種小規模的發送任務只要是celery任務啓動,就應該可以在納秒級解決異步任務,
    解決:
    方法1:
    在celery調用的函數中添加返回值,對經過celery的執行結果來get()這個值,用這個值做爲標記來判斷celery的狀態,再執行後續的操做。
    方法2:
    應該chord也可使用,方法和1差很少,chord調用的是兩個celery任務,在前一個celery任務中使用調用函數的返回值,做爲傳入遞交給第二個celery任務,在第二個celery任務中對傳入進行判斷在進行操做。
  5. 郵件服務配置
import smtplib
from email.header import Header
from email.mime.text import MIMEText

#配置郵箱服務
smtp = smtplib.SMTP('smtp_server,'25')
smtp.helo('plain')
smtp.ehlo()
smtp.starttls()
smtp.set_debuglevel(1)
#登陸
smtp.login('username',pwd')

#構造消息
msg = MIMEText('要發送的消息', 'plain', 'utf-8')
msg['From'] = u'Sdata Monitor <從哪兒發送>'
msg['Subject'] = Header(u'標題', 'utf-8').encode()
msg['To'] = ['245088135@qq.com']
msg['To'] = ','.join(['xxxxxx@qq.com'])

#發送郵件
#注意msg的as_string()方法
smtp.sendmail('smtp_server', ['接收者郵箱‘’], msg.as_string())

#msg
'Content-Type: text/plain; charset="utf-8"\nMIME-Version: 1.0\nContent-Transfer-Encoding: base64\nFrom: xxxxx <xxxxxx>\nSubject: =?utf-8?q?xxxxxx?=\nTo: xxxx@xx.com\n\nYXNkYXNkYXNkYXNk\n'
  1. 在使用發送郵件時,有好幾回服務器連不上的狀況,不知道啥狀況,上一次還好的,下一次就不兇了
  2. 微信發送消息
{
   "touser" : "UserID1|UserID2|UserID3",
   "toparty" : "PartyID1|PartyID2",
   "totag" : "TagID1 | TagID2",
   "msgtype" : "text",
   "agentid" : 1,
   "text" : {
       "content" : "你的快遞已到,請攜帶工卡前往郵件中心領取。\n出發前可查看<a href=\"http://work.weixin.qq.com\">郵件中心視頻實況</a>,聰明避開排隊。"
   },
   "safe":0
}

touser、toparty、totag根據情境選擇,能夠爲空,但不能同時爲空

  1. setting_manager類裏面已經包含了從緩存中取數據的函數。緩存中取不到就去數據庫中取。

    6.26

  2. 導出項目的依賴包
    pip list >> requirements.txt
    直接處處的格式並不能直接使用pip install -r xxxx.txt
    處理:
with open('requirements.txt','r') as r:
  with open('requirements_new.txt','w') as w:
      data = r.read()
      data.pop(0)
      data.pop(0)
      for i in data:
          i = i.split(' ',1)
          i[1] = i[1].strip()
          i = '=='.join(i)
          w.write(i)
  1. zabbix的值映射,
  2. 背景:在視圖中使用了兩個celery任務,後一個celery任務依賴上一個celery任務的結果,經過上一個celery返回的結果進行下一步操做
    問題:想的是要用異步的,但是這兩個任務產生了關聯,後一個任務仍是有等待,其實成了同步了,很差
    解決:將狀態判斷通通移到第二個celery任務中,缺什麼參數就傳什麼參數,
    可是這樣仍是有一個問題,將判斷移動到第二個任務中,兩個任務多是在視圖調用時併發的啓動的,第二個任務須要用到第一個任務的task_id值,有可能當下獲取不到,致使celery狀態一直是pending
    解決,作一個time.sleep()間隔本身定,而後作一個while循環,
while 1:
        res = AsyncResult(id=task_id, app=send_msg)
        if res.ready():
            break
        else:
            time.sleep(0.5)
            continue

條件沒達成,就休眠0.5秒繼續執行一次任務,知道條件達成,break
以爲這種方式仍是很差,之後還得改

  1. 消息發送平臺的重點在權限,不一樣帳號登錄的用戶用不一樣的key調用第三方短信平臺,再記錄下發送記錄供之後審計使用。三張表,用戶表,介質表,設置表,用介質表作中介,鏈接用戶和設置,使用戶和設置項配對起來。
    setting.objects.filter(media_id=media.objects.get(user_id=self.request.user.id).value).values()這樣就獲得全部符合條件的數據,再循環遍歷獲得一個字典

    6.27

  2. 今天的代碼跟實際狀況一結合,就不能用了,實際狀況不是想能想到的,因此得從新寫,在重寫的時候,由於加了新的條件,改動較大,我老固化到原來的邏輯中,不想新方法,或者用其餘方法達成。糾結了很久,最後把那一塊所有推掉從新來一遍,思路一理清,代碼就擼了出來。
    有一個比較有意思的
#一個列表
l = [a 20 b 30 c 40 d 60]
#要把這個作成一個字典
#這樣來
data = dict(zip( [i for i in l[::2]], [j for j in l[1::2]] ))
這樣就能夠獲得想要的字典,  切片設置步長和起始位置是頗有用的
  1. 在zabbix的接口調用中。search真的是一個神器,相似於contains,只要條件中的字段包含,就能被檢索出來,可是隻能定義一個條件, api.xxx.get(search={'key':'xxx'}),可是filter可使用一個數組 api.xxx.get(filter={'name':['條件1','條件2']})
  2. zabbix的接口調用中,trend的獲取能夠把 time_from time_till設置成同一個整點值,意在只去那一個時間點的信息。
  3. 在變量傳遞的時候,設置一箇中建量來接收真的是一個不錯的選擇。
  4. 還須要多練啊,想的東西仍是太少,需求下來要先好好把關鍵點記下來,捨本取末,真的菜。

    6.28

  5. 需求理解仍是問題,get不到點事真的噁心,作出來的東西都是錯的。
  6. requests模塊的使用,發送post請求的時候,最好發送json數據,假如是字典結構,在發送時進行json.dump()最好。還有就是在請求頭的構造中,加上contenttype=json,accept都加上,否則django服務端老返回415解碼錯誤。
  7. 在本地啓動的服務,假如要讓外部主機鏈接,若是這個ip不加到ALLOW_HOST中則返回400錯誤,能夠將ALLOW_HOST設置爲 * 容許全部的外部ip訪問
  8. 在django-admin中,能夠建立類,建立方法,對模型的展現進行定製化。

相關文章
相關標籤/搜索